Submission #255617

#TimeUsernameProblemLanguageResultExecution timeMemory
255617shayan_pPipes (BOI13_pipes)C++14
100 / 100
76 ms13944 KiB
// And you curse yourself for things you never done

#include<bits/stdc++.h>

#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll, ll> pll;

const int maxn = 1e6 + 10, mod = 1e9 + 7, inf = 1e9 + 10;

ll c[maxn], ans[maxn];
pll p[maxn];
int ID;

int tp[maxn], to[maxn], nxt[maxn];

void add_edge(int a, int b){
    static int C = 0;
    nxt[C] = tp[a], tp[a] = C, to[C] = b, C++;
}

int mark[maxn];

pll operator - (pll a, pll b){
    return {a.F - b.F, a.S - b.S};
}

void dfs(int u, int par = -1){
    p[u].F = c[u];
    mark[u] = 1;
    for(int id = tp[u]; id != -1; id = nxt[id]){
	if(mark[to[id]] == 1 && to[id] != par){
	    if(ID == -1)
		ID = id >> 1;
	    if(ID != (id >> 1))
		cout << 0 << endl, exit(0);
	    p[u].S--;
	}
	else if(mark[to[id]] != 1){
	    dfs(to[id], u);
	    p[u]= p[u] - p[to[id]];
	}
    }
}
void go(int u){
    mark[u] = 2;
    for(int id = tp[u]; id != -1; id = nxt[id]){
	if(mark[to[id]] != 2){
	    go(to[id]);
	    ans[id >> 1] = p[to[id]].F + 1ll * (ID == -1 ? 0 : ans[ID]) * p[to[id]].S;
	}
    }
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie();

    memset(tp, -1, sizeof tp);
    
    int n, m;
    cin >> n >> m;

    if(m > n)
	return cout << 0 << endl, 0;
    
    for(int i = 1; i <= n; i++){
	cin >> c[i];
    }
    for(int i = 0; i < m; i++){
	int a, b;
	cin >> a >> b;
	add_edge(a, b);
	add_edge(b, a);
    }
    for(int i = 1; i <= n; i++){
	if(mark[i] == 0){
	    ID = -1;
	    dfs(i);
	    if(ID == -1){
		if(! (p[i].F == 0 && p[i].S == 0) )
		    return cout << 0 << endl, 0;
	    }
	    else{
		if(p[i].S == 0)
		    return cout << 0 << endl, 0;
		if(p[i].F % p[i].S != 0)
		    return cout << 0 << endl, 0;
		ans[ID] = -(p[i].F / p[i].S);
	    }
	    go(i);
	}
    }
    for(int i = 0; i < m; i++){
	cout << 2ll * ans[i] << "\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...