Submission #238097

# Submission time Handle Problem Language Result Execution time Memory
238097 2020-06-09T22:56:09 Z m3r8 Flood (IOI07_flood) C++14
73 / 100
232 ms 64896 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<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

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 time Memory Grader output
1 Correct 11 ms 12032 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 12032 KB Output is correct
2 Correct 12 ms 12032 KB Output is correct
3 Correct 12 ms 12032 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 12160 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 12160 KB Output is correct
2 Correct 12 ms 12160 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 12032 KB Output is correct
2 Correct 12 ms 12032 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 12032 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 12160 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 12160 KB Output is correct
2 Correct 17 ms 12672 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 13 ms 12160 KB Output is correct
2 Correct 13 ms 12160 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 31 ms 13824 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 78 ms 18168 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 97 ms 18208 KB Output is correct
2 Runtime error 203 ms 53652 KB Execution killed with signal 11 (could be triggered by violating memory limits)
# Verdict Execution time Memory Grader output
1 Runtime error 232 ms 45252 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 226 ms 64896 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -