Submission #84980

#TimeUsernameProblemLanguageResultExecution timeMemory
84980nikolapesic2802Seats (IOI18_seats)C++14
5 / 100
4038 ms60736 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back int N; struct segTree{ vector<int> ones,tri; void init() { ones.resize(4*N); tri.resize(4*N); } void prop(int i) { ones[2*i]+=ones[i]; ones[2*i+1]+=ones[i]; ones[i]=0; tri[2*i]+=tri[i]; tri[2*i+1]+=tri[i]; tri[i]=0; } void add(int qs,int qe,int x,int sta,int i=1,int l=0,int r=N-1) { if(r<qs||l>qe) return; if(qs<=l&&r<=qe) { if(sta==0) ones[i]+=x; else tri[i]+=x; return; } int m=(l+r)>>1; prop(i); add(qs,qe,x,sta,2*i,l,m); add(qs,qe,x,sta,2*i+1,m+1,r); } bool get(int poz,int i=1,int l=0,int r=N-1) { if(l>poz||r<poz) return false; if(l==r&&poz==l){ //printf("%i: %i %i\n",poz,ones[i],tri[i]); return ones[i]==4&&tri[i]==0; } int m=(l+r)>>1; prop(i); return get(poz,2*i,l,m)||get(poz,2*i+1,m+1,r); } } ST; vector<vector<int> > mat; int res=0; int h,w; bool inside(int x,int y) { if(x>=0&&x<h&&y>=0&&y<w) return true; return false; } void update(int x,int y,int z) { vector<int> val; for(int i=0;i<2;i++) for(int j=0;j<2;j++) if(inside(x+i,y+j)) val.pb(mat[x+i][y+j]); sort(val.begin(),val.end()); if(val.size()==4) { ST.add(val[0],val[1]-1,z,0); ST.add(val[2],val[3]-1,z,1); //printf("Dodajem 1 od %i do %i, dodajem 3 od %i do %i\n",val[0],val[1]-1,val[2],val[3]-1); } if(val.size()==3) { assert(0); } if(val.size()==2) { ST.add(val[0],val[1]-1,z,0); //printf("Dodajem 1 od %i do %i\n",val[0],val[1]-1); } if(val.size()==1) { ST.add(val[0],N-1,z,0); //printf("Dodajem 1 od %i do %i\n",val[0],N-1); } } vector<int> r,c; vector<bool> sol; void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) { h=H; w=W; sol.resize(H*W); mat.resize(H); for(int i=0;i<H;i++) mat[i].resize(W); N=H*W; ST.init(); for(int i=0;i<H*W;i++){ mat[R[i]][C[i]]=i; r.pb(R[i]); c.pb(C[i]); } for(int i=-1;i<H;i++) for(int j=-1;j<W;j++) update(i,j,1); for(int i=0;i<H*W;i++) { if(ST.get(i)){ //printf("%i\n",i); res++; sol[i]=true; } else sol[i]=false; } //printf("%i\n",res); } int swap_seats(int a, int b) { //printf("%i %i %i %i\n",r[a],c[a],r[b],c[b]); for(int i=-1;i<=0;i++) for(int j=-1;j<=0;j++) update(r[a]+i,c[a]+j,-1); for(int i=-1;i<=0;i++) for(int j=-1;j<=0;j++) update(r[b]+i,c[b]+j,-1); //printf("Cmon!\n"); swap(mat[r[a]][c[a]],mat[r[b]][c[b]]); swap(r[a],r[b]); swap(c[a],c[b]); /*for(int i=0;i<h;i++) { for(int j=0;j<w;j++) printf("%i ",mat[i][j]); printf("\n"); }*/ for(int i=-1;i<=0;i++) for(int j=-1;j<=0;j++) update(r[a]+i,c[a]+j,1); for(int i=-1;i<=0;i++) for(int j=-1;j<=0;j++) update(r[b]+i,c[b]+j,1); vector<int> values; /*for(int i=-1;i<=1;i++) for(int j=-1;j<=1;j++) if(inside(r[a]+i,c[a]+j)) values.pb(mat[r[a]+i][c[a]+j]); for(int i=-1;i<=1;i++) for(int j=-1;j<=1;j++) if(inside(r[b]+i,c[b]+j)) values.pb(mat[r[b]+i][c[b]+j]);*/ for(int i=0;i<N;i++) values.pb(i); sort(values.begin(),values.end()); values.erase(unique(values.begin(),values.end()),values.end()); for(auto p:values) { bool t=ST.get(p); //printf("%i: %i\n",p,t); if(sol[p]) { if(!t) { sol[p]=false; res--; } } else { if(t) { sol[p]=true; res++; } } } return res; }
#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...