제출 #84975

#제출 시각아이디문제언어결과실행 시간메모리
84975nikolapesic2802자리 배치 (IOI18_seats)C++14
0 / 100
1945 ms119220 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; } 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) return ones[i]<=4&&tri[i]==0; int m=(l+r)>>1; 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; 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++) val.pb(mat[x+i][y+j]); sort(val.begin(),val.end()); ST.add(val[0],val[1]-1,z,0); //printf("Jedinice od %i do %i, trojke od %i do %i\n",val[0],val[1]-1,val[2],val[3]-1); ST.add(val[2],val[3]-1,z,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=0;i<H-1;i++) for(int j=0;j<W-1;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; } } bool inside(int x,int y) { if(x>=0&&x<h&&y>=0&&y<w) return true; return false; } int swap_seats(int a, int b) { for(int i=-1;i<=0;i++) for(int j=-1;j<=0;j++) if(inside(r[a]+i,c[a]+j)) update(r[a]+i,c[a]+j,-1); for(int i=-1;i<=0;i++) for(int j=-1;j<=0;j++) if(inside(r[b]+i,c[b]+j)) update(r[b]+i,c[b]+j,-1); swap(mat[r[a]][c[a]],mat[r[b]][c[b]]); for(int i=-1;i<=0;i++) for(int j=-1;j<=0;j++) if(inside(r[a]+i,c[a]+j)) update(r[a]+i,c[a]+j,1); for(int i=-1;i<=0;i++) for(int j=-1;j<=0;j++) if(inside(r[b]+i,c[b]+j)) update(r[b]+i,c[b]+j,1); vector<int> values; for(int i=-1;i<=0;i++) for(int j=-1;j<=0;j++) if(inside(r[a]+i,c[a]+j)) values.pb(mat[r[a]][c[a]]); for(int i=-1;i<=0;i++) for(int j=-1;j<=0;j++) if(inside(r[b]+i,c[b]+j)) values.pb(mat[r[b]][c[b]]); for(auto p:values) { bool t=ST.get(p); if(values[t]) { if(!t) { values[t]=false; res--; } } else { if(t) { values[t]=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...