답안 #484705

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
484705 2021-11-05T07:45:07 Z idas Pipes (BOI13_pipes) C++17
70 / 100
391 ms 53384 KB
#include <bits/stdc++.h>
#define FOR(i, begin, end) for(int i = (begin); i < (end); i++)
#define FAST_IO ios_base::sync_with_stdio(false); cin.tie(nullptr)
#define TSTS int ttt; cin >> ttt; while(ttt--) solve()
#define F first
#define S second
#define PB push_back
#define MP make_pair

using namespace std;
typedef pair<int, int> pii;
typedef pair<long long, long long> pll;
typedef pair<long double, long double> pff;
typedef map<int, int> mii;
typedef vector<int> vi;
typedef long double ld;
typedef long long ll;

const int INF=1e9, MOD=1e9+7;

void setIO()
{
    FAST_IO;
}

void setIO(string s)
{
    FAST_IO;
    freopen((s+".in").c_str(), "r", stdin);
    freopen((s+".out").c_str(), "w", stdout);
}

const int N=5e5+10;
int n, m;
ll c[N], non[N];
vi ad[N];
bool v[N], vc[N];
map<pii, ll> x;
map<int, pii> con;

queue<int> q;
void bfs()
{
    while(!q.empty()){
        int u=q.front(); q.pop();
        if(v[u]) continue;
        v[u]=true;
        int cn=0;
        for(auto it : ad[u]){
            if(!x.count({it, u})) cn++;
        }
        if(cn>=2){
            v[u]=false;
            continue;
        }
        int in=-1;
        ll sm=0;
        for(auto it : ad[u]){
            if(!x.count({it, u})) in=it;
            sm+=x[{it, u}];
        }
        q.push(in);
        x[{in, u}]=x[{u, in}]=2LL*c[u]-sm;
    }
}

int inn;
ll sm, all;
void dfs(int u)
{
    v[u]=true; vc[u]=true;
    if(inn&1){
        sm+=2*c[u]-non[u];
    }
    all+=2*c[u]-non[u];
    inn++;
    for(auto it : ad[u]){
        if(v[it]) continue;
        dfs(it);
    }
}

int in;

void getA()
{
    int l=-1;
    for(auto it : ad[in]){
        if(!v[it]){
            if(l==-1) l=it;
            else break;
        }
    }
    dfs(l);
    x[{in, l}]=x[{l, in}]=all/2-sm;
}

void build(int u)
{
    vc[u]=false;
    ll have=0;
    for(auto it : ad[u]){
        if(x.count({u, it})) have+=x[{u, it}];
    }
    for(auto it : ad[u]){
        if(!x.count({u, it})){
            x[{u, it}]=x[{it, u}]=2LL*c[u]-have;
        }
    }
    for(auto it : ad[u]){
        if(!vc[it]) continue;
        build(it);
    }
}

void getNon()
{
    FOR(i, 0, n)
    {
        if(!v[i]){
            for(auto it : ad[i]){
                if(v[it]){
                    non[i]+=x[{i, it}];
                }
            }
        }
    }
}

int main()
{
    setIO();
    cin >> n >> m;
    FOR(i, 0, n) cin >> c[i];
    FOR(i, 0, m)
    {
        int a, b; cin >> a >> b; a--; b--;
        ad[a].PB(b);
        ad[b].PB(a);
        con[i]={a, b};
    }
    if(n<m){
        cout << 0;
        return 0;
    }

    vi lf;
    FOR(i, 0, n) if(ad[i].size()==1) lf.PB(i);

    for(auto u : lf){
        q.push(u);
    }

    bfs();
    getNon();

    int cycsz=0;
    FOR(i, 0, n)
    {
        if(!v[i]) cycsz++;
    }

    if(cycsz&1^1){
        cout << 0 << '\n';
        return 0;
    }

    FOR(i, 0, n)
    {
        if(!v[i]){
            in=i;
        }
    }

    if(in==-1){
        FOR(i, 0, m)
        {
            cout << x[con[i]] << '\n';
        }
        return 0;
    }

    getA();
    build(in);

    FOR(i, 0, m)
    {
        cout << x[con[i]] << '\n';
    }
}

Compilation message

pipes.cpp: In function 'int main()':
pipes.cpp:163:13: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
  163 |     if(cycsz&1^1){
      |        ~~~~~^~
pipes.cpp: In function 'void setIO(std::string)':
pipes.cpp:29:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   29 |     freopen((s+".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pipes.cpp:30:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |     freopen((s+".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 12060 KB Output isn't correct
2 Incorrect 7 ms 12096 KB Output isn't correct
3 Incorrect 8 ms 12288 KB Output isn't correct
4 Incorrect 336 ms 35024 KB Output isn't correct
5 Incorrect 6 ms 11980 KB Output isn't correct
6 Incorrect 6 ms 12108 KB Output isn't correct
7 Incorrect 6 ms 12112 KB Output isn't correct
8 Incorrect 6 ms 12108 KB Output isn't correct
9 Incorrect 7 ms 12236 KB Output isn't correct
10 Incorrect 8 ms 12236 KB Output isn't correct
11 Incorrect 8 ms 12236 KB Output isn't correct
12 Incorrect 16 ms 12312 KB Output isn't correct
13 Incorrect 303 ms 30396 KB Output isn't correct
14 Incorrect 340 ms 33804 KB Output isn't correct
15 Incorrect 357 ms 35176 KB Output isn't correct
16 Incorrect 307 ms 31668 KB Output isn't correct
17 Incorrect 376 ms 35048 KB Output isn't correct
18 Incorrect 359 ms 35164 KB Output isn't correct
19 Incorrect 233 ms 34896 KB Output isn't correct
20 Incorrect 6 ms 11980 KB Output isn't correct
21 Incorrect 7 ms 12308 KB Output isn't correct
22 Incorrect 329 ms 35172 KB Output isn't correct
23 Incorrect 287 ms 30384 KB Output isn't correct
24 Incorrect 340 ms 35096 KB Output isn't correct
25 Incorrect 335 ms 31340 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 12108 KB Output is correct
2 Correct 7 ms 12364 KB Output is correct
3 Correct 178 ms 28900 KB Output is correct
4 Correct 60 ms 22172 KB Output is correct
5 Correct 64 ms 21940 KB Output is correct
6 Correct 239 ms 53172 KB Output is correct
7 Correct 7 ms 12108 KB Output is correct
8 Correct 7 ms 11980 KB Output is correct
9 Correct 6 ms 11980 KB Output is correct
10 Correct 6 ms 12076 KB Output is correct
11 Correct 6 ms 11980 KB Output is correct
12 Correct 6 ms 11980 KB Output is correct
13 Correct 6 ms 11980 KB Output is correct
14 Correct 6 ms 12108 KB Output is correct
15 Correct 7 ms 12364 KB Output is correct
16 Correct 7 ms 12236 KB Output is correct
17 Correct 7 ms 12236 KB Output is correct
18 Correct 6 ms 12108 KB Output is correct
19 Correct 7 ms 12236 KB Output is correct
20 Correct 7 ms 12108 KB Output is correct
21 Correct 7 ms 12236 KB Output is correct
22 Correct 7 ms 12364 KB Output is correct
23 Correct 223 ms 38436 KB Output is correct
24 Correct 287 ms 42936 KB Output is correct
25 Correct 174 ms 29024 KB Output is correct
26 Correct 73 ms 22212 KB Output is correct
27 Correct 61 ms 22096 KB Output is correct
28 Correct 61 ms 22512 KB Output is correct
29 Correct 192 ms 45232 KB Output is correct
30 Correct 270 ms 42004 KB Output is correct
31 Correct 291 ms 48148 KB Output is correct
32 Correct 375 ms 38732 KB Output is correct
33 Correct 165 ms 28152 KB Output is correct
34 Correct 62 ms 22216 KB Output is correct
35 Correct 63 ms 22224 KB Output is correct
36 Correct 62 ms 22340 KB Output is correct
37 Correct 284 ms 53384 KB Output is correct
38 Correct 272 ms 41924 KB Output is correct
39 Correct 391 ms 37776 KB Output is correct
40 Correct 307 ms 42320 KB Output is correct
41 Correct 93 ms 24200 KB Output is correct
42 Correct 66 ms 22152 KB Output is correct
43 Correct 70 ms 22244 KB Output is correct
44 Correct 61 ms 21956 KB Output is correct
45 Correct 196 ms 47988 KB Output is correct
46 Correct 262 ms 41356 KB Output is correct
47 Correct 322 ms 42632 KB Output is correct
48 Correct 274 ms 47596 KB Output is correct
49 Correct 311 ms 32776 KB Output is correct
50 Correct 61 ms 22352 KB Output is correct
51 Correct 64 ms 22296 KB Output is correct
52 Correct 60 ms 22072 KB Output is correct
53 Correct 213 ms 48856 KB Output is correct
54 Correct 274 ms 41152 KB Output is correct