이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ff first
#define ss second
#define endl '\n'
using namespace std;
const long long INF = (long long) 1e18;
const int mod = (int) 1e9+7;
const int MAXN = (int) 5e5+5;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll n, m;
pii edg[MAXN];
int c[MAXN];
vector<pii> adj[MAXN];
int sz[MAXN];
ll ans[MAXN];
bool vis[MAXN];
int remd;
void dfs(int v){
sz[v]--;
for(pii j: adj[v]){
//cerr<<v<<" "<<j.ff<<endl;
if(sz[j.ff] <= 0) continue;
ans[j.ss] = 2*c[v];
c[j.ff] -= c[v];
c[v] = 0;
sz[j.ff]--;
remd--;
if(sz[j.ff] == 1){
dfs(j.ff);
}
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
#ifdef Local
freopen("C:/Users/Admin/Desktop/Yazilim/C/IO/int.txt","r",stdin);
freopen("C:/Users/Admin/Desktop/Yazilim/C/IO/out.txt","w",stdout);
#endif
cin>>n>>m;
remd = m;
for(int i = 0; i < n; i++){
cin>>c[i + 1];
}
if(n == 2){
if(c[1] == c[2]){
cout<<c[1]<<endl;
}else{
cout<<0<<endl;
}
return 0;
}
for(int i = 0; i < m; i++){
int a, b;
cin>>a>>b;
adj[a].push_back({b, i});
adj[b].push_back({a, i});
sz[a]++;
sz[b]++;
}
for(int i = 1; i <= n; i++){
if(sz[i] == 1){
//cout<<i<<endl;
dfs(i);
}
}
int kal = 0;
int bir = -1;
for(int i = 1; i <= n; i++){
//cout<<c[i]<<" ";
if(sz[i]){
kal++;
bir = i;
}
}
//cout<<endl<<kal<<endl;
//cerr<<kal<<endl;
if(kal == 0){
bool tru = 1;
for(int i = 1; i <= n; i++){
tru = (tru && c[i] == 0);
}
if(tru){
for(int i = 0; i < m; i++){
cout<<ans[i]<<endl;
}
}else{
cout<<0<<endl;
}
}else if(remd > kal || kal % 2 == 0){
cout<<0<<endl;
}else{
int cur = bir;
for(pii j: adj[cur]){
if(sz[j.ff] != 0){
cur = j.ff;
}
}
int idx = 0;
int top = 0, last = -1;
while(cur != bir){
if(idx % 2){
top -= c[cur];
}else{
top += c[cur];
}
idx++;
for(pii nx: adj[cur]){
if(nx.ff == last) continue;
if(sz[nx.ff] > 0){
last = cur;
cur = nx.ff;
break;
}
}
}
//cerr<<top<<endl;
for(pii j: adj[bir]){
if(j.ff == last) continue;
if(sz[j.ff] > 0){
if((top +c[bir] ) % 2 != 0){
cout<<0<<endl;
return 0;
}
int deg = (top + c[bir]) / 2;
ans[j.ss] = 2*deg;
cur = j.ff;
c[j.ff] -= deg;
break;
}
}
last = bir;
while(cur != bir){
for(pii nx: adj[cur]){
if(nx.ff == last) continue;
if(sz[nx.ff] > 0){
ans[nx.ss] = 2*c[cur];
c[nx.ff] -= c[cur];
last = cur;
cur = nx.ff;
break;
}
}
}
for(int i = 1; i <= m; i++){
cout<<ans[i - 1]<<endl;
}
}
#ifdef Local
cout<<endl<<fixed<<setprecision(2)<<1000.0 * clock() / CLOCKS_PER_SEC<< " milliseconds ";
#endif
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |