제출 #972506

#제출 시각아이디문제언어결과실행 시간메모리
972506vjudge1무지개나라 (APIO17_rainbow)C++14
23 / 100
74 ms11124 KiB
#include "rainbow.h"

#include <bits/stdc++.h>

using namespace std;

struct DSU{
   int n;
   vector<int> lab;
   int cc;
   void init(int _n){
      n=_n;
      cc=n;
      lab.assign(n+1, -1);
   }
   int find_set(int u){
      return lab[u]<0?u:lab[u]=find_set(lab[u]);
   }
   void union_sets(int u, int v){
      u=find_set(u), v=find_set(v);
      if (u!=v){
         if (lab[u]>lab[v]) swap(u, v);
         lab[u]+=lab[v];
         lab[v]=u;
         --cc;
      }
   }
} dsu, dsu1, dsu2;

const int N=2e5+10;
const int dx[]={1, -1, 0, 0}, dy[]={0, 0, 1, -1};
bool a[100][100], a2[3][N];
int pf[3][N], pf1[N], pf2[N];
int r, c;

void init(int R, int C, int sr, int sc, int M, char *S) {
   if (R==2){
      r=R, c=C;
      a2[sr][sc]=1;
      for (int i=0; i<M; ++i){
         if (S[i]=='N') --sr;
         if (S[i]=='S') ++sr;
         if (S[i]=='E') ++sc;
         if (S[i]=='W') --sc;
         a2[sr][sc]=1;
      }
      dsu.init(r*c);
      for (int i=1; i<=r; ++i) for (int j=1; j<=c; ++j){
         if (!a2[i][j]){
            for (int k=0; k<4; ++k){
               int x=i+dx[k], y=j+dy[k];
               if (x<1 || y<1 || x>r || y>c || a2[x][y]) continue;
               dsu.union_sets((i-1)*c+(j-1), (x-1)*c+(y-1));
            }
         }
      }
      dsu1.init(c), dsu2.init(c);
      for (int j=1; j<=c; ++j){
         if (!a2[1][j]){
            for (int k=2; k<4; ++k){
               int x=1, y=j+dy[k];
               if (y<1 || y>c || a2[x][y]) continue;
               dsu1.union_sets(j-1, y-1);
            }
         }
      }
      for (int j=1; j<=c; ++j){
         if (!a2[2][j]){
            for (int k=2; k<4; ++k){
               int x=2+dx[k], y=j+dy[k];
               if (y<1 || y>c || a2[x][y]) continue;
               dsu2.union_sets(j-1, y-1);
            }
         }
      }
      for (int i=1; i<=r; ++i) for (int j=1; j<=c; ++j){
         pf[i][j]=pf[i][j-1];
         if (!a2[i][j] && dsu.lab[(i-1)*c+j-1]<0) ++pf[i][j];
      }
      for (int i=1; i<=c; ++i){
         pf1[i]=pf1[i-1];
         if (!a2[1][i] && dsu1.lab[i-1]<0) ++pf1[i];
      }
      for (int i=1; i<=c; ++i){
         pf2[i]=pf2[i-1];
         if (!a2[2][i] && dsu2.lab[i-1]<0) ++pf2[i];
      }
   }else{
      r=R, c=C;
      a[sr][sc]=1;
      for (int i=0; i<M; ++i){
         if (S[i]=='N') --sr;
         if (S[i]=='S') ++sr;
         if (S[i]=='E') ++sc;
         if (S[i]=='W') --sc;
         a[sr][sc]=1;
      }
   }
}

int colour(int ar, int ac, int br, int bc) {
   if (r==2){
      set<int> st;
      int ans=0;
      if (ar==br && ar==1){
         ans=pf1[bc]-pf1[ac-1];
         if (!a2[ar][ac] && dsu1.find_set(ac-1)>=0) st.insert(dsu1.find_set(ac-1));
         if (!a2[ar][bc] && dsu1.find_set(bc-1)>=0) st.insert(dsu1.find_set(bc-1));
         for (int i:st) if (i<ac-1 || i>bc-1) ++ans;
      }else if (ar==br){
         ans=pf2[bc]-pf2[ac-1];
         if (!a2[ar][ac] && dsu2.find_set(ac-1)>=0) st.insert(dsu2.find_set(ac-1));
         if (!a2[ar][bc] && dsu2.find_set(bc-1)>=0) st.insert(dsu2.find_set(bc-1));
         for (int i:st) if (i<ac-1 || i>bc-1) ++ans;
      }else{
         ans=pf[1][bc]-pf[1][ac-1]+pf[2][bc]-pf[2][ac-1];
         if (!a2[ar][ac] && dsu.find_set(ac-1)>=0) st.insert(dsu.find_set(ac-1));
         if (!a2[ar][bc] && dsu.find_set(bc-1)>=0) st.insert(dsu.find_set(bc-1));
         if (!a2[br][ac] && dsu.find_set(c+ac-1)>=0) st.insert(dsu.find_set(c+ac-1));
         if (!a2[br][bc] && dsu.find_set(c+bc-1)>=0) st.insert(dsu.find_set(c+bc-1));
         for (int i:st) if ((i%c<ac-1 || i%c>bc-1)) ++ans;
      }
      return ans;
   }
   dsu.init((br-ar+1)*(bc-ac+1));
   for (int i=ar; i<=br; ++i) for (int j=ac; j<=bc; ++j){
      if (a[i][j]) --dsu.cc;
      else{
         for (int k=0; k<4; ++k){
            int x=i+dx[k], y=j+dy[k];
            if (x<ar || y<ac || x>br || y>bc || a[x][y]) continue;
            dsu.union_sets((i-ar)*(bc-ac+1)+(j-ac), (x-ar)*(bc-ac+1)+(y-ac));
         }
      }
   }
   return dsu.cc;
}

#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...