Submission #88717

#TimeUsernameProblemLanguageResultExecution timeMemory
88717popovicirobertPipes (BOI13_pipes)C++14
100 / 100
288 ms22548 KiB
#include <bits/stdc++.h>
#define lsb(x) (x & (-x))
#define ll long long
#define ull unsigned long long
// 217
// 44

using namespace std;

const int MAXM = (int) 5e5;
const int MAXN = (int) 1e5;

vector < pair <int, int> > g[MAXN + 1];
int even[MAXN + 1], father[MAXN + 1], n;
bool vis[MAXN + 1];

void dfs(int nod) {
    vis[nod] = 1;
    for(auto it : g[nod]) {
        if(vis[it.first] == 0) {
            even[it.first] = (even[nod] ^ 1);
            father[it.first] = nod;
            dfs(it.first);
        }
    }
}

inline void detect_cycle(bool &cycle) {
    memset(even, -1, sizeof(even));
    even[1] = 0;
    dfs(1);
    int cnt = 0;
    for(int i = 1; i <= n; i++) {
        for(auto it : g[i]) {
            if(even[i] != even[it.first] && !(father[it.first] == i || father[i] == it.first)) {
                cout << 0;
                exit(0);
            }
            if(even[i] == even[it.first]) {
                cnt++;
            }
        }
    }
    cnt /= 2;
    if(cnt > 1) {
        cout << 0;
        exit(0);
    }
    if(cnt) {
        cycle = 1;
    }
}

ll c[MAXN + 1];
ll sol[MAXM + 1];

int deg[MAXN + 1];

inline void solve_tree(bool cycle) {
    int i;
    memset(father, 0, sizeof(father));
    memset(vis, 0, sizeof(vis));
    queue <int> Q;
    for(i = 1; i <= n; i++) {
        if(g[i].size() == 1) {
            Q.push(i);
            vis[i] = 1;
        }
    }
    int root;
    while(Q.size()) {
        int nod = Q.front();
        root = nod;
        Q.pop();
        for(auto it : g[nod]) {
            if(father[it.first] != nod) {
                deg[it.first]++;
                father[nod] = it.first;
                sol[it.second] = c[nod];
                c[it.first] -= c[nod];
                c[nod] = 0;
                if(deg[it.first] + 1 == g[it.first].size()) {
                    Q.push(it.first);
                    vis[it.first] = 1;
                }
            }
        }
    }
    if(cycle == 0) {
        for(i = 1; i <= n; i++) {
            if(c[i] != 0) {
                cout << 0;
                exit(0);
            }
        }
    }
}

void dfs1(int nod, vector < pair <int, int> > &nodes, int par, int root) {
    vis[nod] = 1;
    for(auto it : g[nod]) {
        if(it.first == par) {
            continue;
        }
        if(vis[it.first] == 0) {
            nodes.push_back({nod, it.second});
            dfs1(it.first, nodes, nod, root);
        }
        else if(it.first == root) {
            nodes.push_back({nod, it.second});
        }
    }
}

inline void solve_cycle(bool cycle) {
    if(cycle == 0) {
        return ;
    }
    int i, nod;
    for(i = 1; i <= n; i++) {
        if(vis[i] == 0) {
            nod = i;
            break;
        }
    }
    vector < pair <int, int> > nodes;
    dfs1(nod, nodes, 0, nod);
    int sz = nodes.size();
    ll tot = 0;
    for(auto it : nodes) {
        tot += c[it.first];
    }
    tot /= 2;
    ll sum = 0;
    for(i = 0; i + 1 < sz; i += 2) {
        sum += c[nodes[i].first];
    }
    sol[nodes[sz - 2].second] = tot - sum;
    c[nodes[sz - 2].first] -= tot - sum;
    for(i = sz - 3; i >= 0; i--) {
        sol[nodes[i].second] = c[nodes[i + 1].first];
        c[nodes[i].first] -= sol[nodes[i].second];
    }
    sum = 0;
    for(auto it : nodes) {
        sum += sol[it.second];
    }
    sol[nodes.back().second] = tot - sum;
}

int main() {
    //ifstream cin("A.in");
    //ofstream cout("A.out");
    int i, m;
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n >> m;
    for(i = 1; i <= n; i++) {
        cin >> c[i];
        c[i] *= 2LL;
    }
    for(i = 1; i <= m; i++) {
        int x, y;
        cin >> x >> y;
        g[x].push_back({y, i});
        g[y].push_back({x, i});
    }
    bool cycle = 0;
    detect_cycle(cycle);
    solve_tree(cycle);
    solve_cycle(cycle);
    for(i = 1; i <= m; i++) {
        cout << sol[i] << "\n";
    }
    //cin.close();
    //cout.close();
    return 0;
}

Compilation message (stderr)

pipes.cpp: In function 'void solve_tree(bool)':
pipes.cpp:82:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if(deg[it.first] + 1 == g[it.first].size()) {
                    ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
pipes.cpp:70:9: warning: variable 'root' set but not used [-Wunused-but-set-variable]
     int root;
         ^~~~
pipes.cpp: In function 'void solve_cycle(bool)':
pipes.cpp:127:9: warning: 'nod' may be used uninitialized in this function [-Wmaybe-uninitialized]
     dfs1(nod, nodes, 0, nod);
     ~~~~^~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...