Codeforces Global Round 6

↘锁芯ラ 提交于 2019-12-18 02:53:20

好演啊,完蛋了,只会ABC。

首先A就想复杂了一开始就应该往质因数分解那里想。

B看了图也想复杂了,观察一下很显然。

C看错题太演了,单行单列要小心一点。

D应该先看榜的,比赛不是乱做,应该看榜,前面一圈人秒杀D,D就不应该是复杂的图,又消环又干嘛的。

消环DAG确实可以,这波亏一半。

priority_queue<pii> G[200005];

void AddEdge(int u, int v, int w) {
    if(u == v || w == 0)
        return;
    if(!G[v].empty()) {
        pii tmp = G[v].top();
        if(tmp.second == u) {
            G[v].pop();
            if(w >= tmp.first) {
                w -= tmp.first;
                AddEdge(u, v, w);
                return;
            } else {
                tmp.first -= w;
                G[v].push(tmp);
                return;
            }
        }
        if(w >= tmp.first) {
            G[v].pop();
            AddEdge(u, tmp.second, tmp.first);
            AddEdge(u, v, w - tmp.first);
            return;
        } else {
            G[v].pop();
            tmp.first -= w;
            G[v].push(tmp);
            AddEdge(u, tmp.second, w);
            return;
        }
    }
    if(w)
        G[u].push({w, v});
}

vector<pii> G2[200005];
vector<int> AG2[200005];
queue<int> Q;

priority_queue<pii> G4[200005];

void AddEdge2(int u, int v, int w) {
    if(u == v || w == 0)
        return;
    if(!G4[v].empty()) {
        pii tmp = G4[v].top();
        if(tmp.second == u) {
            G4[v].pop();
            if(w >= tmp.first) {
                w -= tmp.first;
                AddEdge2(u, v, w);
                return;
            } else {
                tmp.first -= w;
                G4[v].push(tmp);
                return;
            }
        }
        if(w >= tmp.first) {
            G4[v].pop();
            AddEdge2(u, tmp.second, tmp.first);
            AddEdge2(u, v, w - tmp.first);
            return;
        } else {
            G4[v].pop();
            tmp.first -= w;
            G4[v].push(tmp);
            AddEdge2(u, tmp.second, w);
            return;
        }
    }
    if(w)
        G4[u].push({w, v});
}

int outdeg[200005];

map<int, ll> G5[200005];

void test_case() {
    int n, m;
    scanf("%d%d", &n, &m);
    while(m--) {
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        AddEdge(u, v, w);
    }
    for(int i = 1; i <= n; ++i) {
        while(!G[i].empty()) {
            pii tmp = G[i].top();
            G[i].pop();
            int v = tmp.second, w = tmp.first;
            G2[i].push_back({v, w});
            AG2[v].push_back(i);
        }
    }
    for(int i = 1; i <= n; ++i) {
        outdeg[i] = G2[i].size();
        if(outdeg[i] == 0)
            Q.push(i);
    }
    while(!Q.empty()) {
        int u = Q.front();
        Q.pop();
        for(auto &e : G2[u])
            AddEdge2(u, e.first, e.second);
        for(auto &v : AG2[u]) {
            --outdeg[v];
            if(outdeg[v] == 0)
                Q.push(v);
        }
    }
    for(int i = 1; i <= n; ++i) {
        while(!G4[i].empty()) {
            pii tmp = G4[i].top();
            G4[i].pop();
            int u = i, w = tmp.first, v = tmp.second;
            G5[u][v] += w;
        }
    }
    int sum=0;
    for(int i = 1; i <= n; ++i)
        sum += G5[i].size();
    printf("%d\n", sum);
    for(int i = 1; i <= n; ++i) {
        for(auto &e : G5[i])
            printf("%d %d %lld\n", i, e.first, e.second);
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!