# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
238090 | 2020-06-09T22:11:03 Z | m3r8 | Flood (IOI07_flood) | C++14 | 344 ms | 50920 KB |
#include <stdio.h> #include <set> #include <utility> #include <vector> #include <queue> #define N 100100 #define W N*2 #define ii std::pair<int,int> ii pp[N]; ii wl[W]; std::vector<int> adj[N]; unsigned short zone[N<<2]; unsigned short path[N]; std::set<unsigned short> sadj[W]; std::vector<int> akt; std::vector<int> akt2; bool used[N]; int tbl[4] = {2,1,0,3}; void cc(int v){ used[v] = 1; akt.push_back(v); for(auto i: adj[v]){ if(wl[i].first == v)akt2.push_back(i); if(!used[wl[i].first]){ cc(wl[i].first); }; if(!used[wl[i].second]){ cc(wl[i].second); }; }; }; int cnt = 1; void ccp(int ip){ zone[ip] = cnt; int p = ip >> 2; int on = ip % 4; int a,b; int tprev = (on+3)%4; int tnxt = (on+1)%4; int prev = tprev + (p << 2); int nxt = tnxt + (p << 2); int app; for(auto i: adj[p]){ if(wl[i].first == p)app = wl[i].second; else app = wl[i].first; a = pp[app].first - pp[p].first == 0; if(a)b = pp[app].second - pp[p].second < 0; else b = pp[app].first - pp[p].first < 0; a = b * 2 + a; //printf("%d\n",a); if(tbl[on] == a){ nxt = tprev + (app << 2); }; if((tbl[on] + 1)%4 == a){ prev = tnxt + (app << 2); }; }; //printf("%d go from %d %d to %d %d and %d %d prev: %d nxt: %d cnt: %d\n",ip,pp[p].first,pp[p].second,pp[prev >> 2].first,pp[prev >> 2].second,pp[nxt >> 2].first,pp[nxt >> 2].second,prev,nxt,cnt); if(!zone[prev])ccp(prev); if(!zone[nxt])ccp(nxt); }; std::queue<ii> que; std::vector<int> erg; int main(void){ int n; scanf("%d",&n); for(int i = 0;i<n;i++){ scanf("%d %d",&(pp[i].first),&(pp[i].second)); }; int w; scanf("%d",&w); int a,b; for(int i = 0;i<w;i++){ scanf("%d %d",&a,&b); a--; b--; adj[a].push_back(i); adj[b].push_back(i); wl[i].first = a; wl[i].second = b; if(pp[a] > pp[b]){ wl[i].first = b; wl[i].second = a; }; }; int mnid; ii mn; int prcnt = 1; for(int i = 0;i<n;i++){ if(!used[i]){ akt.clear(); akt2.clear(); cc(i); if(akt.size() > 1){ mn = pp[akt[0]]; mnid = akt[0]; for(auto j: akt){ if(pp[j] < mn){ mn = pp[j]; mnid = j; }; for(int k = 0;k<4;k++){ if(!zone[k + (j << 2)]){ ccp(k + (j << 2)); cnt++; }; }; }; for(auto j: akt2){ if(pp[wl[j].second].second - pp[wl[j].first].second == 0){ sadj[zone[2 + (wl[j].first << 2)]].insert(zone[3 + (wl[j].first << 2)]); sadj[zone[3 + (wl[j].first << 2)]].insert(zone[2 + (wl[j].first << 2)]); //if(zone[2 + (wl[j].first << 2)] != zone[1 + (wl[j].second << 2)])printf("error\n"); //if(zone[3 + (wl[j].first << 2)] != zone[0 + (wl[j].second << 2)])printf("error\n"); }else{ sadj[zone[1 + (wl[j].first << 2)]].insert(zone[2 + (wl[j].first << 2)]); sadj[zone[2 + (wl[j].first << 2)]].insert(zone[1 + (wl[j].first << 2)]); //if(zone[1 + (wl[j].first << 2)] != zone[0 + (wl[j].second << 2)])printf("error\n"); //if(zone[2 + (wl[j].first << 2)] != zone[3 + (wl[j].second << 2)])printf("error\n"); }; }; que.push({zone[(mnid << 2)],1}); path[zone[(mnid << 2)]] = 1; while(que.size()){ ii akk = que.front();que.pop(); for(auto nxt: sadj[akk.first]){ if(!path[nxt]){ path[nxt] = akk.second + 1; que.push({nxt,akk.second + 1}); }; }; }; for(int j = prcnt;j<cnt;j++){ sadj[j].clear(); }; prcnt = cnt; }; }; }; for(int i = 0;i<w;i++){ if(pp[wl[i].second].second - pp[wl[i].first].second == 0){ if(path[zone[2 + (wl[i].first << 2)]] == path[zone[3 + (wl[i].first << 2)]]){ erg.push_back(i+1); }; }else{ if(path[zone[1 + (wl[i].first << 2)]] == path[zone[2 + (wl[i].first << 2)]]){ erg.push_back(i+1); }; }; }; printf("%d\n",erg.size()); for(auto i : erg){ printf("%d\n",i); }; return 0; };
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 11 ms | 12160 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 11 ms | 12032 KB | Output is correct |
2 | Correct | 11 ms | 12160 KB | Output is correct |
3 | Correct | 14 ms | 12032 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 14 ms | 12032 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 11 ms | 12032 KB | Output is correct |
2 | Correct | 11 ms | 12160 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 11 ms | 12032 KB | Output is correct |
2 | Correct | 11 ms | 12032 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 10 ms | 12160 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 11 ms | 12160 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 11 ms | 12160 KB | Output is correct |
2 | Correct | 11 ms | 12192 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 13 ms | 12160 KB | Output is correct |
2 | Correct | 13 ms | 12208 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 34 ms | 13560 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 99 ms | 23672 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 79 ms | 17272 KB | Output is correct |
2 | Correct | 344 ms | 29116 KB | Output is correct |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 216 ms | 23712 KB | Output is correct |
2 | Runtime error | 268 ms | 34152 KB | Memory limit exceeded (if you are sure your verdict is not MLE, please contact us) |
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 268 ms | 30196 KB | Output is correct |
2 | Runtime error | 228 ms | 50920 KB | Memory limit exceeded (if you are sure your verdict is not MLE, please contact us) |