Submission #221970

#TimeUsernameProblemLanguageResultExecution timeMemory
221970infinite_iqPipes (BOI13_pipes)C++14
74.07 / 100
867 ms91256 KiB
    #define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
    #include <bits/stdc++.h>
    using namespace std;
    #define sqr 340
    #define mid (l+r)/2
    #define pb push_back
    #define ppb pop_back
    #define fi first
    #define se second
    #define lb lower_bound
    #define ub upper_bound
    #define ins insert
    #define era erase
    #define C continue
    #define mem(dp,i) memset(dp,i,sizeof(dp))
    #define mset multiset
    typedef long long ll;
    typedef short int si;
    typedef long double ld;
    typedef pair<int,int> pi;
    typedef pair<ll,ll> pll;
    typedef vector<int> vi;
    typedef vector<ll> vll;
    typedef vector<pi> vpi;
    typedef vector<pll> vpll;
    const ll inf=1e18;
    const ld pai=acos(-1);
    ll n , m , all ;
    set<pll>v[500009];
    ll val[500009] , ans[500009] , ret[500009] , VAL[500009] ,done[500009];;
    ll start ;
    ll calc(int node , ll p ){
            done [node] = 1 ;
            ll ret = 0 ;
            for ( auto u : v[node] ) {
                    if ( done [u.fi] ) C ;
                    ret = calc ( u.fi , val[u.fi] - p) ;
                    break ;
            }
      done [node] = 0 ;
            return ret + p ;
    }
    void solve ( int node) {
            done [node] = 1 ;
            ll out = 0 ;
            for ( auto u : v[node] ) {
                    if ( done [u.fi] ) C ;
                    val[u.fi] -= val[node] ;
                    ans [ u.se ] = val[node];
                    solve( u.fi ) ;
                    out = 1 ;
                    break;
            }
            if ( !out ) {
                    for ( auto u :v[node] ) {
                            if ( u.fi == start ) {
                                    ans [ u.se ] = val[ node];
                                    break ;
                            }
                    }
            }
    }
    int main () {
            mem ( ret , -1 ) ;
            cin >> n >> m ;
            for ( int i = 0 ; i < n ; i ++ ) cin >> val[i] ;
            for ( int i = 0 ; i < m ; i ++ ) {
                    int a , b ;
                    cin >> a >> b ;
                    a -- , b -- ;
                    v[a].ins( { b , i } ) ;
                    v[b].ins( { a , i } ) ;
            }
            if ( m > n ) {
                    cout << 0 << endl ;
                    exit ( 0 ) ;
            }
            set<pll>s;
            for ( int i = 0 ; i < n ; i ++ ) {
                    s.ins ( { v[i].size() , i } ) ;
            }
            while ( ( s.size() && s.begin()->fi==1 ) ) {
                    int node = s.begin() -> se ;
              done [node] = 1 ;
                    int to = v[node].begin() -> fi ;
                    int id = v[node].begin() -> se ;
                    s.era(s.begin());
                    v[node].era( v[node].begin() );
                    s.era ( { v[to].size() , to } ) ;
                    v[to].era( { node , id } ) ;
                    if ( v[to].size() ) s.ins ( { v[to].size() , to } ) ;
                    ans [ id ] = -val [ node ] ;
                    val [ to ] += -val[node];
                    val [ node ] = 0 ;
            }
            if ( s.size() && s.size() % 2 == 0 ) cout << 0 << endl , exit ( 0 ) ;
            if ( !s.size() ) {
                    for ( int i = 0 ; i < m ; i ++ ) {
                            cout << -1ll*ans [i] *2ll << endl ;
                    }
                    exit ( 0 ) ;
            }
            for ( auto u : s ) all += val[u.se] ;
            all /= 2;
            start = s.begin()->se;
            val[start] = all - calc ( 0 , 0 ) ;
            solve(0);
            for ( int i = 0 ;i < m ;i ++ ) cout << -1ll*ans[i]*2ll << endl;
    }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...