Submission #1247600

#TimeUsernameProblemLanguageResultExecution timeMemory
1247600DedibeatPipes (BOI13_pipes)C++20
100 / 100
302 ms37880 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define F first 
#define S second 
#define all(x) (x).begin(), (x).end()
template<typename T, typename U>
ostream &operator<<(ostream &os, const pair<T, U> &p)
{
    return os << "(" << p.F << "," << p.S << ")";
}
template<typename T> 
void print(const T &v, int lim = 1e9)
{
    for(auto x : v)
        if(lim-- > 0) cout << x << " ";
    cout << endl;
}
template<typename T>
void print(T *begin, const T *end)
{
    for(T *it = begin; it < end; it++)
        cout << *it << " ";
    cout << endl;
}

vector<pair<int, int>> adj[100005];
int deg[100005], val[100005], ans[500005];
int vis[100005];
int n, m;
void dfs(int v, vector<pair<int, int>> &cyc, int &edge, int &vert)
{
    vert++;
    vis[v] = 2;
    for(auto &[u, id] : adj[v])
    {
        if(vis[u] == 1) continue;
        edge++;
        if(vis[u] == 2) continue;
        cyc.emplace_back(u, id);
        dfs(u, cyc, edge, vert);
    }
}
int32_t main()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
        cin >> val[i];
    for(int i = 0; i < m; i++)
    {
        int u, v;
        cin >> u >> v;
        adj[u].push_back({v, i});
        adj[v].push_back({u, i});
        deg[u]++, deg[v]++;
    }
    queue<int> q;
    auto gogo = [&]()
    {
        for(int i = 1; i <= n; i++)
            if(deg[i] == 1) 
                q.push(i);
        
        while(!q.empty())
        {
            int v = q.front(); q.pop();
            vis[v] = 1;
            for(auto [u, id] : adj[v])
            {
                if(!vis[u])
                {
                    ans[id] = 2 * val[v];
                    val[u] -= val[v];
                    val[v] = 0;
                    if(--deg[u] == 1)
                        q.push(u);
                }
            }
        }
    };

    gogo();
    // print(ans, ans + m);
    // print(val + 1, val + n + 1);

    for(int v = 1; v <= n; v++)
    {
        if(vis[v]) continue;
        vector<pair<int, int>> cyc;
        int edge = 0, vert = 0;
        dfs(v, cyc, edge, vert);
        //cout << edge << " " << vert << endl;
        if(edge / 2 > vert)
        {
            cout << "0\n";
            return 0;
        }
        int tail = cyc.back().F;
        for(auto [u, id] : adj[tail])
        {
            if(u == v) cyc.emplace_back(u, id);
        }

        if(cyc.size() % 2 == 0)
        {
            cout << "0\n";
            return 0;
        }
        reverse(all(cyc));
        int total = 0;
        
        for(auto [u, id] : cyc)
        {
            total += val[u];
        }

        auto [v1, idx] = cyc[0];
        int v2 = cyc[1].F;

        int sum = 0;
        for(int i = 2; i < cyc.size(); i += 2)
        {
            sum += val[cyc[i].F];
        }
        
        int rem = total / 2 - sum;
        ans[idx] = rem * 2;
        val[v1] -= rem; deg[v1]--;
        val[v2] -= rem; deg[v2]--;

        for(int i = 1; i < cyc.size(); i++)
        {
            auto [u, id] = cyc[i];
            ans[id] = 2 * val[u];
            if(i + 1 < cyc.size())
                val[cyc[i + 1].F] -= val[u];
        }
    }

    print(ans, ans + m);







}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...