답안 #484700

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
484700 2021-11-05T07:22:09 Z idas Pipes (BOI13_pipes) C++17
90.9259 / 100
449 ms 53200 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();

    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 '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 Correct 8 ms 12044 KB Output is correct
2 Correct 7 ms 12108 KB Output is correct
3 Correct 8 ms 12280 KB Output is correct
4 Correct 393 ms 35448 KB Output is correct
5 Correct 8 ms 11980 KB Output is correct
6 Correct 7 ms 12108 KB Output is correct
7 Correct 7 ms 12100 KB Output is correct
8 Correct 7 ms 12072 KB Output is correct
9 Correct 8 ms 12236 KB Output is correct
10 Correct 8 ms 12244 KB Output is correct
11 Correct 8 ms 12236 KB Output is correct
12 Correct 8 ms 12312 KB Output is correct
13 Correct 299 ms 30692 KB Output is correct
14 Correct 449 ms 34252 KB Output is correct
15 Correct 411 ms 35740 KB Output is correct
16 Correct 354 ms 31960 KB Output is correct
17 Correct 392 ms 35448 KB Output is correct
18 Correct 370 ms 35620 KB Output is correct
19 Correct 337 ms 35268 KB Output is correct
20 Correct 6 ms 12108 KB Output is correct
21 Correct 8 ms 12236 KB Output is correct
22 Correct 372 ms 35496 KB Output is correct
23 Correct 296 ms 30740 KB Output is correct
24 Correct 413 ms 35548 KB Output is correct
25 Correct 308 ms 31912 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 12092 KB Output is correct
2 Correct 8 ms 12364 KB Output is correct
3 Incorrect 319 ms 41192 KB Output isn't correct
4 Correct 67 ms 22212 KB Output is correct
5 Correct 62 ms 21956 KB Output is correct
6 Correct 291 ms 53200 KB Output is correct
7 Correct 6 ms 12108 KB Output is correct
8 Correct 7 ms 12060 KB Output is correct
9 Incorrect 7 ms 12108 KB Output isn't correct
10 Correct 7 ms 11980 KB Output is correct
11 Correct 7 ms 12120 KB Output is correct
12 Correct 7 ms 12152 KB Output is correct
13 Correct 7 ms 11980 KB Output is correct
14 Correct 6 ms 12108 KB Output is correct
15 Correct 8 ms 12364 KB Output is correct
16 Correct 8 ms 12236 KB Output is correct
17 Incorrect 8 ms 12364 KB Output isn't correct
18 Correct 7 ms 12148 KB Output is correct
19 Correct 7 ms 12108 KB Output is correct
20 Correct 7 ms 12184 KB Output is correct
21 Correct 8 ms 12236 KB Output is correct
22 Correct 8 ms 12364 KB Output is correct
23 Correct 246 ms 38468 KB Output is correct
24 Correct 342 ms 42924 KB Output is correct
25 Incorrect 316 ms 41200 KB Output isn't correct
26 Correct 68 ms 22188 KB Output is correct
27 Correct 78 ms 22160 KB Output is correct
28 Correct 72 ms 22608 KB Output is correct
29 Correct 202 ms 45212 KB Output is correct
30 Correct 312 ms 42064 KB Output is correct
31 Correct 303 ms 48076 KB Output is correct
32 Correct 431 ms 38756 KB Output is correct
33 Incorrect 334 ms 43412 KB Output isn't correct
34 Correct 67 ms 22216 KB Output is correct
35 Correct 74 ms 22172 KB Output is correct
36 Correct 74 ms 22400 KB Output is correct
37 Correct 280 ms 53188 KB Output is correct
38 Correct 315 ms 41980 KB Output is correct
39 Correct 380 ms 37708 KB Output is correct
40 Correct 364 ms 42272 KB Output is correct
41 Incorrect 301 ms 47988 KB Output isn't correct
42 Correct 90 ms 22212 KB Output is correct
43 Correct 69 ms 22184 KB Output is correct
44 Correct 59 ms 21956 KB Output is correct
45 Correct 233 ms 48056 KB Output is correct
46 Correct 291 ms 41408 KB Output is correct
47 Correct 335 ms 42552 KB Output is correct
48 Correct 378 ms 47556 KB Output is correct
49 Incorrect 392 ms 37040 KB Output isn't correct
50 Correct 94 ms 22212 KB Output is correct
51 Correct 73 ms 22288 KB Output is correct
52 Correct 72 ms 22056 KB Output is correct
53 Correct 222 ms 49084 KB Output is correct
54 Correct 321 ms 41060 KB Output is correct