# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
111645 | wilwxk | Pipes (BOI13_pipes) | C++11 | 487 ms | 41540 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=5e5+5;
vector<int> g[MAXN], lista[MAXN];
vector<int> ncyc;
ll v[MAXN], tenho[MAXN];
int gin[MAXN], marc[MAXN];
ll resp[MAXN], soma;
int n, m;
void poda() {
queue<int> qu;
for(int i=1; i<=n; i++) if(gin[i]==1) qu.push(i);
while(!qu.empty()) {
int cur=qu.front(); qu.pop();
gin[cur]=0; ncyc.push_back(cur);
for(int i=0; i<g[cur].size(); i++) {
int viz=g[cur][i]; int ind=lista[cur][i];
if(!gin[viz]) continue;
gin[viz]--;
if(gin[viz]<=1) qu.push(viz);
resp[ind]=v[cur]-tenho[cur];
marc[ind]=1;
tenho[viz]+=resp[ind];
tenho[cur]+=resp[ind];
// printf("%d -> %d (%d, %lld)\n", cur, viz, ind, tenho[cur]);
}
}
}
void dfs(int cur, int k) {
// printf("%d %d\n", cur, k);
gin[cur]=1;
for(int i=0; i<g[cur].size(); i++) {
int viz=g[cur][i]; int ind=lista[cur][i];
if(gin[viz]!=2) continue;
dfs(viz, k^1);
}
if(!k) soma+=v[cur];
else soma-=v[cur];
}
void solve(int cur, int ori) {
gin[cur]=2;
// printf("solve %d\n", cur);
for(int i=0; i<g[cur].size(); i++) {
int viz=g[cur][i]; int ind=lista[cur][i];
if(marc[ind]) continue;
if(cur!=ori) resp[ind]=soma;
else resp[ind]=v[cur]-tenho[cur];
marc[ind]=1;
tenho[viz]+=resp[ind];
tenho[cur]+=resp[ind];
// printf("%d -> %d (%d)\n", cur, viz, resp[ind]);
solve(viz, ori);
}
}
int main() {
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++) scanf("%lld", &v[i]), v[i]*=2;
for(int i=1; i<=m; i++) {
int a, b; scanf("%d %d", &a, &b);
g[a].push_back(b); g[b].push_back(a);
gin[a]++; gin[b]++;
lista[a].push_back(i); lista[b].push_back(i);
}
poda();
for(int i=1; i<=n; i++) if(gin[i]) v[i]-=tenho[i], tenho[i]=0;
// for(int i=1; i<=n; i++) cout << tenho[i] << " " << v[i] << endl;
if(m>n||(n-ncyc.size())%2==0) {
printf("0\n");
return 0;
}
for(int i=1; i<=n; i++) {
if(!gin[i]) continue;
dfs(i, 0);
// printf("ok %lld\n", soma);
solve(i, i);
break;
}
bool ok=1;
for(int i=1; i<=n; i++) if(tenho[i]!=v[i]) ok=0;
// for(int i=1; i<=n; i++) cout << tenho[i] << " " << v[i] << endl;
if(ok) {
for(int i=1; i<=m; i++) printf("%lld\n", resp[i]);
}
else {
printf("0\n");
}
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |