제출 #631404

#제출 시각아이디문제언어결과실행 시간메모리
631404socpitePipes (BOI13_pipes)C++17
75.37 / 100
133 ms131072 KiB
#include<bits/stdc++.h>
using namespace std;

#define f first
#define s second

const int maxn = 1e5+5;

typedef long long ll;

ll lim = 1;

int _s, _t;

int n, m;
vector<int> idx, vert;

int vis[maxn], oncyc[maxn];
ll val[maxn], ans[maxn], A[maxn];
vector<pair<int, int>> graph[maxn];

void find_ep(int x, int p){
    assert(!vis[x]);
    vis[x]=1;
    for(auto v: graph[x]){
        if(v.f == p)continue;
        if(vis[v.f]){
            if(!_s){
                _s = x;
                _t = v.f;
                idx.push_back(v.s);
            }
        }
        else find_ep(v.f, x);
    }
}

void find_cyc(int x, int p){
    if(x == _t)oncyc[x]=1;
    else{
        for(auto v: graph[x]){
            if(v.f == p || (x == _s && v.f == _t) || (x == _t && v.f == _s))continue;
            find_cyc(v.f, x);
            if(oncyc[v.f]){
                idx.push_back(v.s);
                oncyc[x]=1;
                break;
            }
        }
    }
    if(oncyc[x])vert.push_back(x);
}

void solve(int x, int p){
    for(auto v: graph[x]){
        if(v.f == p || oncyc[v.f])continue;
        solve(v.f, p);
        ans[v.s]=val[v.f];
        val[x]-=val[v.f];
    }
}

void dfs(int x, int p){
    //cout << x << endl;
    for(auto v: graph[x]){
        if(v.f == p)continue;
        dfs(v.f, x);
        ans[v.s]=val[v.f];
        val[x]-=val[v.f];
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    if(m > n){
        cout << 0;
        return 0;
    }
    for(int i = 1; i <= n; i++)cin >> val[i];
    for(int i = 1; i <= m; i++){
        int a, b;
        cin >> a >> b;
        graph[a].push_back({b, i});
        graph[b].push_back({a, i});
    }
    if(m == n){
        find_ep(1, 0);
        find_cyc(_s, 0);
        if(!(vert.size()&1)){
            cout << 0;
            return 0;
        }
        assert(vert.size() == idx.size());
        ll sum = 0;
        for(auto v: vert){
            solve(v, 0);
            sum += val[v];
        }
        sum/=2;
        for(int i = 1; i < vert.size(); i+=2)sum-=val[vert[i]];
        ans[idx[0]] = sum;
        for(int i = 1; i < idx.size(); i++)ans[idx[i]] = val[vert[i-1]]-ans[idx[i-1]];
    }
    else{
        dfs(1, 0);
    }
    for(int i = 1; i <= m; i++)cout << ans[i]*2 << "\n";

}

컴파일 시 표준 에러 (stderr) 메시지

pipes.cpp: In function 'int main()':
pipes.cpp:103:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  103 |         for(int i = 1; i < vert.size(); i+=2)sum-=val[vert[i]];
      |                        ~~^~~~~~~~~~~~~
pipes.cpp:105:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |         for(int i = 1; i < idx.size(); i++)ans[idx[i]] = val[vert[i-1]]-ans[idx[i-1]];
      |                        ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...