Submission #680890

#TimeUsernameProblemLanguageResultExecution timeMemory
680890vjudge1Prisoner Challenge (IOI22_prison)C++17
100 / 100
13 ms1440 KiB
#include<vector> #define pr pair<int,int> #define vi vector<int> using namespace std; int n;vector<vi>ans;vector<pr>a[33]; inline vi make(const int&x){return vi(1,x);} inline vi make(const int&x,const int&y) {vector<int>o;o.emplace_back(x);o.emplace_back(y);return o;} inline bool ok(const int&i,const int&l,const int&r) { for(int j=0;j<a[i].size();++j) { if(a[i][j].first<=l&&l<=a[i][j].second)return 0; if(a[i][j].first<=r&&r<=a[i][j].second)return 0; if(l<=a[i][j].first&&a[i][j].first<=r)return 0; if(l<=a[i][j].second&&a[i][j].second<=r)return 0; } return 1; } inline void work(const int&i,const int&l,const int&r,const vi&u, const vi&v,const vi&w) { for(int j=0;j<u.size();++j)for(int k=u[j];k<=v[j];ans[i][k++]=w[j]); if(l>=r)return; int o=ans[i][0],mid=l+r>>1,j; ans[i][l]=-o-1;ans[i][r]=-(o^1)-1; if(r-l==1)return;//边界 if(r-l==2)//边界 { for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r)) { a[j].emplace_back(l,r);ans[i][mid]=j; work(j,l+1,r-1,make(l,r),make(l,r),make(-(o^1)-1,-o-1)); return; } ans.emplace_back(vi(n+1));ans.back()[0]=o^1; j=ans[i][mid]=ans.size()-1;a[j].emplace_back(l,r); work(j,l+1,r-1,make(l,r),make(l,r),make(-(o^1)-1,-o-1)); return; } if(r-l>=6)//分三半 { int m1=l+(r-l-1.)/3+0.5,m2=r-(r-l-1.)/3+0.5; for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))//左 { a[j].emplace_back(l,r); for(int k=l+1;k<=m1;ans[i][k++]=j); work(j,l+1,m1,make(l,m1+1),make(l,r),make(-(o^1)-1,-o-1)); goto qaq; } ans.emplace_back(vi(n+1));ans.back()[0]=o^1; j=ans.size()-1;a[j].emplace_back(l,r); for(int k=l+1;k<=m1;ans[i][k++]=j); work(j,l+1,m1,make(l,m1+1),make(l,r),make(-(o^1)-1,-o-1)); qaq:; for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))//中 { a[j].emplace_back(l,r); for(int k=m1+1;k<m2;ans[i][k++]=j); work(j,m1+1,m2-1,make(l,m2),make(m1,r),make(-(o^1)-1,-o-1)); goto quq; } ans.emplace_back(vi(n+1));ans.back()[0]=o^1; j=ans.size()-1;a[j].emplace_back(l,r); for(int k=m1+1;k<m2;ans[i][k++]=j); work(j,m1+1,m2-1,make(l,m2),make(m1,r),make(-(o^1)-1,-o-1)); quq:; for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))//右 { a[j].emplace_back(l,r); for(int k=m2;k<r;ans[i][k++]=j); work(j,m2,r-1,make(l,r),make(m2-1,r),make(-(o^1)-1,-o-1)); return; } ans.emplace_back(vi(n+1));ans.back()[0]=o^1; j=ans.size()-1;a[j].emplace_back(l,r); for(int k=m2;k<r;ans[i][k++]=j); work(j,m2,r-1,make(l,r),make(m2-1,r),make(-(o^1)-1,-o-1)); return; } for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))//左半边 { a[j].emplace_back(l,r); for(int k=l+1;k<=mid;ans[i][k++]=j); work(j,l+1,mid,make(l,mid+1),make(l,r),make(-(o^1)-1,-o-1)); goto qwq; } ans.emplace_back(vi(n+1));ans.back()[0]=o^1; j=ans.size()-1;a[j].emplace_back(l,r); for(int k=l+1;k<=mid;ans[i][k++]=j); work(j,l+1,mid,make(l,mid+1),make(l,r),make(-(o^1)-1,-o-1)); qwq:; for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))//右半边 { a[j].emplace_back(l,r); for(int k=mid+1;k<r;ans[i][k++]=j); work(j,mid+1,r-1,make(l,r),make(mid,r),make(-(o^1)-1,-o-1)); return; } ans.emplace_back(vi(n+1));ans.back()[0]=o^1; j=ans.size()-1;a[j].emplace_back(l,r); for(int k=mid+1;k<r;ans[i][k++]=j); work(j,mid+1,r-1,make(l,r),make(mid,r),make(-(o^1)-1,-o-1)); } vector<vi>devise_strategy(int N) { n=N;ans.emplace_back(vi(n+1));ans[0][0]=0; work(0,1,n,vi(),vi(),vi()); return ans; }

Compilation message (stderr)

prison.cpp: In function 'bool ok(const int&, const int&, const int&)':
prison.cpp:11:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   11 |  for(int j=0;j<a[i].size();++j)
      |              ~^~~~~~~~~~~~
prison.cpp: In function 'void work(const int&, const int&, const int&, const std::vector<int>&, const std::vector<int>&, const std::vector<int>&)':
prison.cpp:23:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   23 |  for(int j=0;j<u.size();++j)for(int k=u[j];k<=v[j];ans[i][k++]=w[j]);
      |              ~^~~~~~~~~
prison.cpp:25:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   25 |  int o=ans[i][0],mid=l+r>>1,j;
      |                      ~^~
prison.cpp:30:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   30 |   for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))
      |           ~^~~~~~~~~~~
prison.cpp:44:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   44 |   for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))//左
      |           ~^~~~~~~~~~~
prison.cpp:56:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |   for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))//中
      |           ~^~~~~~~~~~~
prison.cpp:68:12: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |   for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))//右
      |           ~^~~~~~~~~~~
prison.cpp:81:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |  for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))//左半边
      |          ~^~~~~~~~~~~
prison.cpp:93:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |  for(j=1;j<ans.size();++j)if(ans[j][0]^o)if(ok(j,l,r))//右半边
      |          ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...