Submission #298038

#TimeUsernameProblemLanguageResultExecution timeMemory
298038miss_robotPipes (BOI13_pipes)C++14
100 / 100
153 ms19064 KiB
#include <bits/stdc++.h>

#pragma GCC optimize("O3")

using namespace std;

const int N = 100000, M = 500000;
int n, m, rmv;
int sol[M], active[N], v[N], out[N];
vector<int> g[N], num[N], s;

int solve(int mode, int val, int u, int l, int a, int b){
	if(a == b) return sol[a] = val/2;
	for(int i = 0, w, x; i < (int)g[u].size(); i++){
		w = g[u][i];
		if(w == l || !active[w]) continue;
		if(mode){
			x = solve(0, val+v[u], w, u, a, num[u][i]);
			sol[b] = x - val;
		}
		else{
			x = solve(1, val-v[u], w, u, a, num[u][i]);
			sol[b] = val - x;
		}
		return x;
	}
	return -1;
}

int main(){
	cin.tie(0);
	ios::sync_with_stdio(0);
	cin >> n >> m;
	if(m > n){
		cout << "0\n";
		return 0;
	}
	for(int i = 0; i < n; i++) cin >> v[i];
	for(int i = 0, u, w; i < m; i++){
		cin >> u >> w;
		u--, w--;
		g[u].push_back(w), g[w].push_back(u);
		num[u].push_back(i), num[w].push_back(i);
	}
	for(int i = 0; i < n; i++) out[i] = g[i].size(), active[i] = 1;;
	for(int i = 0; i < n; i++) if(out[i] == 1) s.push_back(i);
	while(!s.empty()){
		int u = s.back(), j = -1;
		s.pop_back();
		active[u] = 0, rmv++;
		for(int i = 0; i < (int)g[u].size(); i++) if(active[g[u][i]]) j = i;
		if(j == -1) continue;
		sol[num[u][j]] = v[u];
		v[g[u][j]] -= sol[num[u][j]];
		if(--out[g[u][j]] == 1) s.push_back(g[u][j]);
	}
	if(n-rmv && !((n-rmv)%2)){
		cout << "0\n";
		return 0;
	}
	for(int i = 0, a=-1, b=-1; i < n; i++) if(active[i]){
		for(int j = 0, w; j < (int)g[i].size(); j++){
			w = g[i][j];
			if(!active[w]) continue;
			if(a==-1) a = j;
			else b = j;
		}
		solve(0, v[i], g[i][b], i, num[i][a], num[i][b]);
		break;
	}
	for(int i = 0; i < m; i++) cout << 2*sol[i] << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...