Submission #253725

#TimeUsernameProblemLanguageResultExecution timeMemory
253725kimbj0709Pipes (BOI13_pipes)C++14
100 / 100
158 ms22260 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 100050
#define f first
#define s second
vector<int> sum(maxn,0);
vector<int> currsum(maxn,0);
bool visited[2][maxn];
vector<int> ans(maxn);
vector<int> degree(maxn,0);
vector<vector<pair<int,int> > > adj(maxn);
void dfs(int node,int parity){
    visited[parity][node] = 1;
    for(auto k:adj[node]){
        if(visited[!parity][k.f]==0){
            dfs(k.f,!parity);
        }
    }
}
void dfs2(int node,vector<int> &curr){
    curr.push_back(node);
    degree[node]--;
    for(auto k:adj[node]){
        if(degree[k.f]==2){
            dfs2(k.f,curr);
        }
    }
}
int32_t main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int no_of_vertex,no_of_edge;
    int input1,input2;
    cin >> no_of_vertex >> no_of_edge;
    if(no_of_vertex<no_of_edge){
        cout << 0;
        return 0;
    }
    for(int i=1;i<=no_of_vertex;i++){
        cin >> sum[i];
    }
    for(int i=0;i<no_of_edge;i++){
        cin >> input1 >> input2;
        degree[input1]++;
        degree[input2]++;
        adj[input1].push_back({input2,i});
        adj[input2].push_back({input1,i});
    }
    dfs(1,0);
    for(int i=1;i<=no_of_vertex;i++){
        if(visited[0][i]==1&&visited[1][i]==1){
        }
        else if(no_of_edge!=no_of_vertex-1){
            cout << 0;
            return 0;
        }
    }
    deque<int> q1;
    for(int i=1;i<=no_of_vertex;i++){
        if(degree[i]==1){
            q1.push_back(i);
        }
    }
    while(q1.size()!=0){
        int a = q1.front();
        q1.pop_front();
        degree[a]--;
        for(auto k:adj[a]){
            if(degree[k.f]==0){
                continue;
            }
            degree[k.f]--;
            currsum[k.f] += (sum[a]-currsum[a]);
            ans[k.s] = (sum[a]-currsum[a]);
            if(degree[k.f]==1){
                q1.push_back(k.f);
            }
        }
    }
    vector<int> curr;
    for(int i=1;i<=no_of_vertex;i++){
        if(degree[i]==2){
            dfs2(i,curr);
            break;
        }
    }
    if(curr.size()==0){
        for(int i=0;i<no_of_edge;i++){
            cout << ans[i]*2 << "\n";
        }
        return 0;
    }
    int temp = 0;
    for(int i=1;i<curr.size();i++){
        if(i%2==1){
            temp += sum[curr[i]]-currsum[curr[i]];
        }
        else{
            temp -= sum[curr[i]]-currsum[curr[i]];
        }
    }
    int rn = ((sum[curr[0]]-currsum[curr[0]])-temp)/2;
    currsum[curr[0]] += rn;
    currsum[curr[curr.size()-1]]+=rn;
    for(auto k:adj[curr[0]]){
        if(k.f==curr[curr.size()-1]){
            ans[k.s] = rn;
        }
    }
    for(int i=0;i<curr.size()-1;i++){
        int nextval = sum[curr[i]]-currsum[curr[i]];
        for(auto k:adj[curr[i]]){
            if(k.f==curr[i+1]){
                ans[k.s] = nextval;
                currsum[curr[i+1]] += nextval;
            }
        }
    }
    for(int i=0;i<no_of_edge;i++){
        //assert(ans[i]!=0);
        cout << ans[i]*2 << "\n";
    }
 
}

Compilation message (stderr)

pipes.cpp: In function 'int32_t main()':
pipes.cpp:95:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=1;i<curr.size();i++){
                 ~^~~~~~~~~~~~
pipes.cpp:111:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<curr.size()-1;i++){
                 ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...