Submission #1170853

#TimeUsernameProblemLanguageResultExecution timeMemory
1170853fesdrerShuffle (NOI19_shuffle)C++17
100 / 100
70 ms584 KiB
#include "shuffle.h" #include <bits/stdc++.h> using namespace std; namespace Solve1{ int to[5][1005]; void get(vector<vector<int>> rlt,int id){ for(vector<int> i:rlt) to[id][i[0]]=i[1],to[id][i[1]]=i[0]; } vector<int> solve1(int n){ vector<vector<int>> tmp(0); for(int i=1;i<=n;i+=2) tmp.push_back({i,i+1}); vector<vector<int>> rlt=shuffle(tmp); get(rlt,1); tmp.clear(); for(int i=2;i<n;i+=2) tmp.push_back({i,i+1}); tmp.push_back({n,1}); rlt=shuffle(tmp); get(rlt,2); tmp.clear(),tmp.push_back({1,3}),tmp.push_back({2,4}); for(int i=5;i<=n;i+=2) tmp.push_back({i,i+1}); rlt=shuffle(tmp); get(rlt,3); tmp.clear(),tmp.push_back({2,4}),tmp.push_back({3,5}); for(int i=6;i<n;i+=2) tmp.push_back({i,i+1}); tmp.push_back({n,1}); rlt=shuffle(tmp); get(rlt,4); vector<int> ret(0); int st=0; for(int i=1;i<=n;i++) if(to[3][i]!=to[1][i]&&to[4][i]==to[2][i]){ st=i;ret.push_back(i);break; } st=to[1][st],ret.push_back(st); for(int i=2;i<=n/2;i++){ st=to[2][st],ret.push_back(st); st=to[1][st],ret.push_back(st); } return ret; } } namespace Solve2{ int tag[1005]; int lazy1[1005],lazy2[1005],rnk[10000]; pair<int,int> find(vector<vector<int>> x,vector<vector<int>> y){ for(int i:x[0]) tag[i]++; for(int i:y[0]) tag[i]+=2; int cnt3=0; for(int i=1;i<=1000;i++) if(tag[i]==3) cnt3++; if(cnt3==int(x[0].size())-1){ pair<int,int> ret={0,0}; for(int i=1;i<=1000;i++) if(tag[i]==2) ret.first=i; for(int i=1;i<=1000;i++) tag[i]=0; for(int i:x[1]) tag[i]++; for(int i:y[1]) tag[i]+=2; for(int i=1;i<=1000;i++) if(tag[i]==2) ret.second=i; for(int i=1;i<=1000;i++) tag[i]=0; return ret; } else{ for(int i=1;i<=1000;i++) tag[i]=0; pair<int,int> ret={0,0}; for(int i:x[0]) tag[i]++; for(int i:y[1]) tag[i]+=2; for(int i=1;i<=1000;i++) if(tag[i]==2) ret.first=i; for(int i=1;i<=1000;i++) tag[i]=0; for(int i:x[1]) tag[i]++; for(int i:y[0]) tag[i]+=2; for(int i=1;i<=1000;i++) if(tag[i]==2) ret.second=i; for(int i=1;i<=1000;i++) tag[i]=0; return ret; } } void getlazy(vector<vector<int>> ori,vector<vector<int>> tun,int val,int bit){ bool flag=0; for(int i:ori[0]) if(i==1) flag=1; if(flag) for(int i:ori[0]) lazy1[i]+=bit; else for(int i:ori[1]) lazy1[i]+=bit; flag=0; for(int i:tun[0]) if(i==val) flag=1; if(flag) for(int i:tun[0]) lazy2[i]+=bit; else for(int i:tun[1]) lazy2[i]+=bit; } vector<int> solve2(int n){ int len=n/2; vector<vector<int>> tmp(2,vector<int>(0)); for(int i=1;i<=len;i++) tmp[0].push_back(i); for(int i=len+1;i<=n;i++) tmp[1].push_back(i); vector<vector<int>> rlt1=shuffle(tmp); tmp[0].clear(),tmp[1].clear(); tmp[0].push_back(len+1),tmp[1].push_back(1); for(int i=2;i<=len;i++) tmp[0].push_back(i); for(int i=len+2;i<=n;i++) tmp[1].push_back(i); vector<vector<int>> rlt2=shuffle(tmp); tmp[0].clear(),tmp[1].clear(); tmp[0].push_back(n),tmp[1].push_back(1); for(int i=2;i<=len;i++) tmp[0].push_back(i); for(int i=len+1;i<n;i++) tmp[1].push_back(i); vector<vector<int>> rlt3=shuffle(tmp); pair<int,int> dif1=find(rlt1,rlt2),dif2=find(rlt1,rlt3); int val=0; if(dif1.first==dif2.first) val=dif1.first; else if(dif1.first==dif2.second) val=dif1.first; else if(dif1.second==dif2.first) val=dif1.second; else if(dif1.second==dif2.second) val=dif1.second; tmp[0].clear(),tmp[1].clear(); for(int i=1;i<=len;i++) tmp[0].push_back(i); for(int i=len+1;i<=n;i++) tmp[1].push_back(i); getlazy(tmp,rlt1,val,1); for(int bit=1;bit<=len;bit<<=1){ tmp[0].clear(),tmp[1].clear(); for(int i=1;i<=len;i++){ if(i&bit) tmp[0].push_back(i),tmp[1].push_back(i+len); else tmp[1].push_back(i),tmp[0].push_back(i+len); } vector<vector<int>> rltnow=shuffle(tmp); getlazy(tmp,rltnow,val,bit<<1); } for(int i=1;i<=n;i++) rnk[lazy2[i]]=i; vector<int> ret(0); for(int i=1;i<=n;i++) ret.push_back(rnk[lazy1[i]]); return ret; } } namespace Solve3{ struct Node{ int st,orist; vector<int> member; }s[1005]; int f2t1[1005],f1t2more[1005],tag[1005]; void init(vector<vector<int>> rlt1,vector<vector<int>> rlt2,int n,int B,int K){ for(int i=0;i<B;i++){ memset(tag,0,sizeof tag); for(int p:rlt1[i]) tag[p]++; for(int j=0;j<B;j++){ for(int p:rlt2[j]) tag[p]+=2; int cnt=0; for(int p=1;p<=n;p++) if(tag[p]==3) cnt++; if(cnt==K-1){ f2t1[j]=i; for(int p=1;p<=n;p++){ if(tag[p]==1) s[i].st=p; else if(tag[p]==2) f1t2more[i]=p; else if(tag[p]==3) s[i].member.push_back(p); } break; } for(int p:rlt2[j]) tag[p]-=2; } } } void getorist(vector<vector<int>> rlt2,vector<vector<int>> rlt3,int n,int B,int K){ int id=0; for(int i=0;i<B;i++){ bool flagg=1; for(int j=0;j<B&&flagg;j++){ memset(tag,0,sizeof tag); for(int p:rlt2[i]) tag[p]++; for(int p:rlt3[j]) tag[p]--; bool flag=1; for(int p=1;p<=n;p++) if(tag[p]) flag=0; if(flag) flagg=0; } if(!flagg){ id=i; break; } } id=f2t1[id]; for(int i=0;i<B;i++){ s[id].orist=i,id=f1t2more[id]; for(int j=0;j<B;j++) if(s[j].st==id){ id=j;break; } } } int belongid[1005],toptag[1005],val[1005]; vector<int> solve(int n,int B,int K){ vector<vector<int>> tmp(B,vector<int>(0)); for(int i=0;i<B;i++) for(int j=K;j>=1;j--) tmp[i].push_back(j+i*K); vector<vector<int>> rlt1=shuffle(tmp); tmp[0].back()+=K,tmp[1].back()-=K; vector<vector<int>> rlt3=shuffle(tmp); for(int i=0;i<B;i++){ tmp[i].clear(),tmp[i].push_back((i+1)%B*K+1); for(int j=2;j<=K;j++) tmp[i].push_back(j+i*K); } vector<vector<int>> rlt2=shuffle(tmp); init(rlt1,rlt2,n,B,K); getorist(rlt2,rlt3,n,B,K); sort(s,s+B,[&](const Node &x,const Node &y){return x.orist<y.orist;}); //for(int i=0;i<B;i++){ // cout<<s[i].st<<" "<<s[i].orist<<endl; // for(int j:s[i].member) cout<<j<<" "; // cout<<endl; //} for(int i=0;i<B;i++){ toptag[s[i].st]=1,belongid[s[i].st]=i; for(int j:s[i].member) belongid[j]=i; } for(int bit=1;bit<=K;bit*=B){ for(int i=0;i<B;i++){ tmp[i].clear(); tmp[i].push_back(i*K+1); } for(int i=0;i<B;i++){ for(int j=2;j<=K;j++){ int p=(i+(j/bit)%B)%B; tmp[p].push_back(j+i*K); } } vector<vector<int>> rlt=shuffle(tmp); for(int i=0;i<B;i++){ int nowid=0; for(int j:rlt[i]) if(toptag[j]){ nowid=belongid[j];break; } for(int j:rlt[i]) if(!toptag[j]) val[j]+=bit*((nowid+B-belongid[j])%B); } } vector<int> ret(0); for(int i=0;i<B;i++){ sort(s[i].member.begin(),s[i].member.end(),[&](const int &x,const int &y){ return val[x]<val[y]; }); ret.push_back(s[i].st); for(int j:s[i].member) ret.push_back(j); } //for(int i:ret) cout<<i<<" "<<val[i]<<endl; //cout<<endl; return ret; } } vector<int> solve(int N, int B, int K, int Q, int ST) { if(K==2) return Solve1::solve1(N); if(B==2) return Solve2::solve2(N); return Solve3::solve(N,B,K); }
#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...