답안 #436483

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
436483 2021-06-24T14:14:56 Z mat_v Simurgh (IOI17_simurgh) C++14
13 / 100
250 ms 5272 KB
#include "simurgh.h"
#include <bits/stdc++.h>
#define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
#define pb push_back
#define pii pair<int,int>
#define xx first
#define yy second

using namespace std;

pii ed[500005];
int _n;

int disc[505];
bool bio[505];
vector<pii> graf[505];
pii cale[505];
vector<pii> gore[505];
int br=1;
int odg[500005];

void dfs(int x){
    disc[x] = br;
    bio[x] = 1;
    for(auto c:graf[x]){
        if(bio[c.xx])continue;
        cale[c.xx] = {x,c.yy};
        br++;
        dfs(c.xx);
    }
}

set<int> s;
int poc;

int dsu[505];
int finddsu(int x){
    if(x == dsu[x])return x;
    return dsu[x] = finddsu(dsu[x]);
}


int pitaj(){
    vector<int> r;
    for(auto c:s)r.pb(c);
    ff(i,0,_n-1)dsu[i] = i;
    for(auto c:r){
        if(finddsu(ed[c].xx) == finddsu(ed[c].yy))assert(false);
        dsu[finddsu(ed[c].xx)] = finddsu(ed[c].yy);
    }
    return count_common_roads(r);
}

vector<pii> sad;
vector<int> ans;
vector<int> imam;

void resi(int x){
    for(auto c:graf[x]){
        if(cale[c.xx].xx == x)resi(c.xx);
    }
    if(x == 0)return;
    int i = x;
    sad.clear();
    int mks = poc;
    sad.pb({poc,cale[i].yy});
    bool da = 0;

    for(auto c:gore[i]){
        s.erase(cale[i].yy);
        s.insert(c.yy);
        int sta = pitaj();
        if(sta != poc)da = 1;
        mks = max(mks, sta);
        sad.pb({sta, c.yy});
        s.erase(c.yy);
        s.insert(cale[i].yy);
    }
    if(da){
        for(auto c:sad){
            if(c.xx == mks){
                ans.pb(c.yy);
                odg[c.yy] = 1;
            }
        }
    }
    else{
        bool ima = 0;
        for(auto c:imam){
            int mn = min(disc[ed[c].xx], disc[ed[c].yy]);
            if(mn < disc[x]){
                ima = 1;
                s.erase(cale[i].yy);
                s.insert(c);
                int kurac = pitaj();
                if(kurac == poc){
                    odg[cale[i].yy] = odg[c];
                }
                else if(kurac < poc)odg[cale[i].yy] = 1;
                s.erase(c);
                s.insert(cale[i].yy);
                break;
            }
        }
        if(!ima)odg[cale[i].yy] = 1;
        if(odg[cale[i].yy] == 1){
            for(auto c:sad){
                odg[c.yy] = 1;
                ans.pb(c.yy);
            }
        }
    }
    for(auto c:gore[i])imam.pb(c.yy);

}

std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v) {
	std::vector<int> r(n - 1);
    int m = u.size();
    _n = n;
    ff(i,0,m - 1){
        ed[i] = {u[i],v[i]};
        graf[u[i]].pb({v[i],i});
        graf[v[i]].pb({u[i],i});
    }
    ff(i,0,n - 1)cale[i].xx = -1;
    dfs(0);
    ff(i,0,m - 1){
        int prvi = u[i];
        int drugi = v[i];
        if(cale[prvi].xx == drugi || cale[drugi].xx == prvi)continue;
        if(disc[prvi] < disc[drugi]){
            gore[drugi].pb({prvi,i});
        }
        else gore[prvi].pb({drugi,i});
    }
    ff(i,0,m - 1){
        if(cale[u[i]].xx == v[i] || cale[v[i]].xx == u[i])s.insert(i);
    }
    //cout << "kurcina\n";
    poc = pitaj();
    resi(0);
    int pp = ans.size();
    assert(pp == n-1);
    return ans;

}
/*
4 6
0 1
0 2
0 3
1 2
1 3
2 3
0 1 5
*/

Compilation message

simurgh.cpp: In function 'int pitaj()':
simurgh.cpp:3:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    3 | #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
      |                           ^
simurgh.cpp:46:5: note: in expansion of macro 'ff'
   46 |     ff(i,0,_n-1)dsu[i] = i;
      |     ^~
simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:3:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    3 | #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
      |                           ^
simurgh.cpp:121:5: note: in expansion of macro 'ff'
  121 |     ff(i,0,m - 1){
      |     ^~
simurgh.cpp:3:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    3 | #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
      |                           ^
simurgh.cpp:126:5: note: in expansion of macro 'ff'
  126 |     ff(i,0,n - 1)cale[i].xx = -1;
      |     ^~
simurgh.cpp:3:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    3 | #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
      |                           ^
simurgh.cpp:128:5: note: in expansion of macro 'ff'
  128 |     ff(i,0,m - 1){
      |     ^~
simurgh.cpp:3:27: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    3 | #define ff(i,a,b) for(int (i) = (a); (i) <= (b); ++(i))
      |                           ^
simurgh.cpp:137:5: note: in expansion of macro 'ff'
  137 |     ff(i,0,m - 1){
      |     ^~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB correct
2 Correct 1 ms 332 KB correct
3 Correct 2 ms 204 KB correct
4 Correct 1 ms 332 KB correct
5 Correct 1 ms 332 KB correct
6 Correct 2 ms 332 KB correct
7 Correct 1 ms 332 KB correct
8 Correct 1 ms 332 KB correct
9 Correct 1 ms 332 KB correct
10 Correct 1 ms 332 KB correct
11 Correct 1 ms 332 KB correct
12 Correct 1 ms 332 KB correct
13 Correct 1 ms 332 KB correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB correct
2 Correct 1 ms 332 KB correct
3 Correct 2 ms 204 KB correct
4 Correct 1 ms 332 KB correct
5 Correct 1 ms 332 KB correct
6 Correct 2 ms 332 KB correct
7 Correct 1 ms 332 KB correct
8 Correct 1 ms 332 KB correct
9 Correct 1 ms 332 KB correct
10 Correct 1 ms 332 KB correct
11 Correct 1 ms 332 KB correct
12 Correct 1 ms 332 KB correct
13 Correct 1 ms 332 KB correct
14 Correct 4 ms 332 KB correct
15 Correct 5 ms 332 KB correct
16 Correct 5 ms 384 KB correct
17 Correct 4 ms 424 KB correct
18 Correct 2 ms 332 KB correct
19 Correct 3 ms 332 KB correct
20 Correct 3 ms 332 KB correct
21 Correct 3 ms 332 KB correct
22 Runtime error 3 ms 588 KB Execution killed with signal 6
23 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB correct
2 Correct 1 ms 332 KB correct
3 Correct 2 ms 204 KB correct
4 Correct 1 ms 332 KB correct
5 Correct 1 ms 332 KB correct
6 Correct 2 ms 332 KB correct
7 Correct 1 ms 332 KB correct
8 Correct 1 ms 332 KB correct
9 Correct 1 ms 332 KB correct
10 Correct 1 ms 332 KB correct
11 Correct 1 ms 332 KB correct
12 Correct 1 ms 332 KB correct
13 Correct 1 ms 332 KB correct
14 Correct 4 ms 332 KB correct
15 Correct 5 ms 332 KB correct
16 Correct 5 ms 384 KB correct
17 Correct 4 ms 424 KB correct
18 Correct 2 ms 332 KB correct
19 Correct 3 ms 332 KB correct
20 Correct 3 ms 332 KB correct
21 Correct 3 ms 332 KB correct
22 Runtime error 3 ms 588 KB Execution killed with signal 6
23 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB correct
2 Correct 1 ms 332 KB correct
3 Incorrect 250 ms 5272 KB WA in grader: NO
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB correct
2 Correct 1 ms 332 KB correct
3 Correct 2 ms 204 KB correct
4 Correct 1 ms 332 KB correct
5 Correct 1 ms 332 KB correct
6 Correct 2 ms 332 KB correct
7 Correct 1 ms 332 KB correct
8 Correct 1 ms 332 KB correct
9 Correct 1 ms 332 KB correct
10 Correct 1 ms 332 KB correct
11 Correct 1 ms 332 KB correct
12 Correct 1 ms 332 KB correct
13 Correct 1 ms 332 KB correct
14 Correct 4 ms 332 KB correct
15 Correct 5 ms 332 KB correct
16 Correct 5 ms 384 KB correct
17 Correct 4 ms 424 KB correct
18 Correct 2 ms 332 KB correct
19 Correct 3 ms 332 KB correct
20 Correct 3 ms 332 KB correct
21 Correct 3 ms 332 KB correct
22 Runtime error 3 ms 588 KB Execution killed with signal 6
23 Halted 0 ms 0 KB -