社区讨论

40pts qiu da lao bang tiao

P7113[NOIP2020] 排水系统参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mi4a5kqb
此快照首次捕获于
2025/11/18 15:56
3 个月前
此快照最后确认于
2025/11/18 21:01
3 个月前
查看原帖
wo da bu liao zhong weng,suo yi da jia lian xi yi xia ping ying ba
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int l[1000005],a[1000005][6];
__int128 p[1000005],q[1000005];
queue<int>st;
vector<int>E[1000005];
bool f[1000005];
void add(__int128 &a,__int128 &b,__int128 x,__int128 y,int d){
    if(x == 0 || y == 0)return;
    y *= d;
    if(a == 0){
        b = y;
        a = x;
        return;
    }
    // if(y == 0){
    //     cout << a << " " << b << " " << x << "\n";
    //     return;
    // }
    __int128 g1 = __gcd(b , y);
    __int128 lcm = b * y / g1;
    __int128 bg = lcm / b,gy = lcm / y;
    b *= bg;
    a *= bg;
    x *= gy;
    a += x;
    // if(a == 0 || b == 0){
    //     cout << d << " " << x << " " << y << "\n";
    //     return;
    // }
    // if(a == 0 && b != 0 || a != 0 && b == 0){
    //     cout <<4234242 ;
    //     exit(0);
    // }
    // if(a == 0 || b == 0)return;
    __int128 g = __gcd(a , b);
    a /= g;
    b /= g;
    return;
}
int mmmm = 0;
void bfs(){
    while(!st.empty()){
        int u = st.front();
        st.pop();
        if(0 == q[u] && p[u] == 0)continue;
        for(int i = 0 ; i < (int)E[u].size() ; i ++){
            int v = E[u][i];
            add(p[v] , q[v] , p[u] , q[u] , E[u].size());
            // cout << u << ' ' << v << '\n';
            // cout << v << " " << p[v] << " " << q[v] << " " << p[u] << " " << q[u] << " " << E[u].size() << "\n";
            if(f[v])continue;
            st.push(v);
        }
        // if(E[u].size() == 0){
        //     mmmm = u;
        //     return;
        // }
        p[u] = q[u] = 0;
    }
    return;
}
void dfs(__int128 x){
    if(x > 9){
        dfs(x / 10);
    }
    long long l = x % 10;
    cout << l;
    return;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin >> n >> m;
    for(int i = 1 ; i <= n ; i ++){
        cin >> l[i];
        if(l[i] == 0)f[i] = 1;
        for(int j = 1 ; j <= l[i] ; j ++){
            cin >> a[i][j];
            E[i].push_back(a[i][j]);
        }
    }
    for(int i = 1 ; i <= m ; i ++){
        p[i] = 1,q[i] = m;
        st.push(i);
    }
    for(int i = m + 1 ; i <= n ; i ++){
        p[i] = 0,q[i] = 1;
    }
    bfs();
    for(int i = 1 ; i <= n ; i ++){
        if(!f[i])continue;
        dfs(p[i]);
        cout << " ";
        dfs(q[i]);
        cout << "\n";
    }
    // cout << mmmm;
    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...