Submission #238097

#TimeUsernameProblemLanguageResultExecution timeMemory
238097m3r8Flood (IOI07_flood)C++14
73 / 100
232 ms64896 KiB
#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<ii> adj[N]; int zone[N<<2]; int path[N]; std::set<int> sadj[W]; int usedW[W]; int used[N]; int tbl[4] = {2,1,0,3}; int cnt = 1; int ccnt = 0; std::queue<ii> que; std::vector<int> erg; void cc(int i){ ccnt = 0; que.push({i,0}); while(que.size()){ ii akk = que.front();que.pop(); used[akk.first] = 1; for(auto i: adj[akk.first]){ if(akk.first == wl[i.second].first)usedW[ccnt++]=i.second; if(!used[i.first]){ que.push({i.first,0}); }; }; }; }; void ccp(int ip){ int p; int on; int a,b; int tprev; int tnxt; int prev; int nxt; que.push({ip,0}); while(que.size()){ ii akk = que.front();que.pop(); zone[akk.first] = cnt; p = akk.first >> 2; on = akk.first % 4; tprev = (on+3)%4; tnxt = (on+1)%4; prev = tprev + (p << 2); nxt = tnxt + (p << 2); for(auto i: adj[p]){ a = pp[i.first].first - pp[p].first == 0; if(a)b = pp[i.first].second - pp[p].second < 0; else b = pp[i.first].first - pp[p].first < 0; a = b * 2 + a; if(tbl[on] == a){ nxt = tprev + (i.first << 2); }; if((tbl[on] + 1)%4 == a){ prev = tnxt + (i.first << 2); }; }; if(!zone[prev])que.push({prev,0}); if(!zone[nxt])que.push({nxt,0}); }; }; 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({b,i}); adj[b].push_back({a,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]){ cc(i); if(ccnt){ mn = pp[wl[usedW[0]].first]; mnid = wl[usedW[0]].first; for(int j = 0;j<ccnt;j++){ int pid = wl[usedW[j]].first; if(pp[pid] < mn){ mn = pp[pid]; mnid = pid; }; for(int k = 0;k<4;k++){ if(!zone[k + (pid << 2)]){ ccp(k + (pid << 2)); cnt++; }; }; pid = wl[usedW[j]].second; if(pp[pid] < mn){ mn = pp[pid]; mnid = pid; }; for(int k = 0;k<4;k++){ if(!zone[k + (pid << 2)]){ ccp(k + (pid << 2)); cnt++; }; }; }; for(int k = 0;k<ccnt;k++){ int j = usedW[k]; 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 (stderr)

flood.cpp: In function 'int main()':
flood.cpp:176:27: warning: format '%d' expects argument of type 'int', but argument 2 has type 'std::vector<int>::size_type {aka long unsigned int}' [-Wformat=]
   printf("%d\n",erg.size());
                 ~~~~~~~~~~^
flood.cpp:79:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&n);
   ~~~~~^~~~~~~~~
flood.cpp:81:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&(pp[i].first),&(pp[i].second));  
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
flood.cpp:84:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&w);
   ~~~~~^~~~~~~~~
flood.cpp:87:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&a,&b);
     ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...