제출 #398253

#제출 시각아이디문제언어결과실행 시간메모리
398253AmineWeslatiWorm Worries (BOI18_worm)C++14
59 / 100
1307 ms499476 KiB
#include "bits/stdc++.h" using namespace std; typedef long long ll; typedef vector<int>vi; #define pb push_back #define sz(v) (int)v.size() typedef string str; #define FOR(i,a,b) for(int i=a; i<b; i++) void IO(){ #ifdef LOCAL freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); #endif } //------------------------------------------------------// void ckmin(int &x, int y){x=min(x,y);} bool ckmax(int &x, int y){ if(y>x){ x=y; return 1; } return 0; } int random(int r){ return rand()%r+1; } const int MX=1e6+10; const int dx[6]={1,-1,0,0,0,0},dy[6]={0,0,1,-1,0,0},dz[6]={0,0,0,0,1,-1}; int N,M,K,Q; vector<vector<vector<int>>>memo; int g[1000][1000]; int lx,ly,lz,rx,ry,rz; int get(int x, int y, int z){ //if(x<lx || y<ly || z<lz || x>rx || y>ry || z>rz) return 0; if(x<1 || y<1 || z<1 || x>N || y>M || z>K) return 0; if(memo[x][y][z]!=-1) return memo[x][y][z]; cout << "? " << x << ' ' << y << ' ' << z << endl; int val; cin>>val; return memo[x][y][z]=val; } void answer(int x, int y, int z){ cout << "! " << x << ' ' << y << ' ' << z << endl; cout.flush(); exit(0); } bool check(int x, int y, int lx, int rx, int ly, int ry){ return x>=lx && x<=rx && y>=ly && y<=ry; } int main(){ IO(); cin>>N>>M>>K>>Q; lx=ly=lz=1; rx=N; ry=M; rz=K; memo.resize(N+1); FOR(i,1,N+1){ memo[i].resize(M+1); FOR(j,1,M+1) memo[i][j].assign(K+1,-1); } if(K!=1){ //3D int rep=Q/2,mx=0,x,y,z; while(rep--){ int xx=random(N),yy=random(M),zz=random(K); if(ckmax(mx,get(xx,yy,zz))){ x=xx; y=yy; z=zz; } } while(1){ int f=0; FOR(m,0,6){ int nx=x+dx[m],ny=y+dy[m],nz=z+dz[m]; if(get(nx,ny,nz)>get(x,y,z)){ f=1; x=nx; y=ny; z=nz; break; } } if(!f) break; } answer(x,y,z); } else{ //2D int px,py,pmx=0; while(lx<=rx){ //if(rx-lx>=ry-ly){ int x=(lx+rx)/2,y=-1,mx=-1; FOR(Y,ly,ry+1){ if(ckmax(mx,get(x,Y,1))) y=Y; } if(mx<pmx){ if(x-1>=px) rx=x-1; else lx=x+1; } else{ int v=get(x-1,y,1),vv=get(x+1,y,1); if(get(x,y,1)>=max(v,vv)) answer(x,y,1); if(v>get(x,y,1)) rx=x-1; else lx=x+1; pmx=mx; px=x; py=y; } //} /*else{ int y=(ly+ry)/2,x=-1,mx=-1; FOR(X,lx,rx+1){ //if(!(max(get(X-1,y,1),get(X+1,y,1))<=get(X,y,1))) continue; if(ckmax(mx,get(X,y,1))) x=X; } if(mx<pmx){ if(check(px,py,lx,ry,ly,y-1)) ry=y-1; else ly=y+1; } else{ int v=get(x,y-1,1),vv=get(x,y+1,1); if(get(x,y,1)>=max(v,vv)) answer(x,y,1); if(v>get(x,y,1) && y-1>=ly) ry=y-1; else ly=y+1; pmx=mx; px=x; py=y; } }*/ } assert(0); } }

컴파일 시 표준 에러 (stderr) 메시지

worm.cpp: In function 'int main()':
worm.cpp:101:10: warning: variable 'py' set but not used [-Wunused-but-set-variable]
  101 |   int px,py,pmx=0;
      |          ^~
worm.cpp:110:6: warning: 'px' may be used uninitialized in this function [-Wmaybe-uninitialized]
  110 |      if(x-1>=px) rx=x-1;
      |      ^~
worm.cpp:97:9: warning: 'z' may be used uninitialized in this function [-Wmaybe-uninitialized]
   97 |   answer(x,y,z);
      |   ~~~~~~^~~~~~~
worm.cpp:97:9: warning: 'y' may be used uninitialized in this function [-Wmaybe-uninitialized]
worm.cpp:97:9: warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
#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...