제출 #347158

#제출 시각아이디문제언어결과실행 시간메모리
347158daniel920712열대 식물원 (Tropical Garden) (IOI11_garden)C++14
100 / 100
3349 ms78264 KiB
#include "garden.h" #include "gardenlib.h" #include "gardenlib.h" #include <vector> #include <utility> #include <algorithm> #include <map> using namespace std; int con[150005]={0}; bool have[5][150005]; int st,aaa,bbb; int con1[5][150005]; int con2[5][150005]; int cir1[5][150005]; int cir2[5][150005]; int in[5][150005]; bool ok=0; map < pair < int , int > , int > all; vector < pair < int , int > > Next[1500005]; void F(int x,int y,int deg,int a,int b) { //printf("aa %d %d %d %d %d %d\n",x,y,a,b,con1[x][y],con2[x][y]); int t,aa,bb; if(have[x][y]) { if(all.find(make_pair(x,y))!=all.end()) { ok=1; t=all[make_pair(x,y)]; aaa=x; bbb=y; //printf("%d\n",t); if(a!=-1&&a>=t) { cir1[x][y]=deg-t; con1[x][y]=cir1[x][y]-(deg-all[make_pair(0,st)]); con1[x][y]%=cir1[x][y]; } if(b!=-1&&b>=t) { cir2[x][y]=deg-t; con2[x][y]=cir2[x][y]-(deg-all[make_pair(1,st)]); con2[x][y]%=cir2[x][y]; } } //printf("%d %d %d %d %d %d\n",x,y,con1[x][y],cir1[x][y],con2[x][y],cir2[x][y]); return; } have[x][y]=1; all[make_pair(x,y)]=deg; if(x==0&&y==st) { a=deg; if(!ok) { cir1[x][y]=-1; con1[x][y]=0; } } if(x==1&&y==st) { b=deg; if(!ok) { cir2[x][y]=-1; con2[x][y]=0; } } if(y==Next[Next[y][x].second][0].second&&con[Next[y][x].second]>1) { aa=1; bb=Next[y][x].second; } else { aa=0; bb=Next[y][x].second; } F(aa,bb,deg+1,a,b); //printf("xx %d %d %d %d %d %d %d\n",x,y,aa,bb,con1[aa][bb],con2[aa][bb],con1[x][y]); if(con1[aa][bb]!=-1) { con1[x][y]=con1[aa][bb]+1; cir1[x][y]=cir1[aa][bb]; if(ok&&cir1[x][y]!=-1) con1[x][y]%=cir1[x][y]; } if(con2[aa][bb]!=-1) { con2[x][y]=con2[aa][bb]+1; cir2[x][y]=cir2[aa][bb]; if(ok&&cir2[x][y]!=-1) con2[x][y]%=cir2[x][y]; } if(x==aaa&&y==bbb) ok=0; //printf("yy %d %d %d %d %d %d\n",x,y,con1[x][y],cir1[x][y],con2[x][y],cir2[x][y]); } void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) { int i=0,j,k,where,ans=0,real; st=P; pair < int , int > now; for(i=0;i<M;i++) { Next[R[i][0]].push_back(make_pair(i,R[i][1])); Next[R[i][1]].push_back(make_pair(i,R[i][0])); con[R[i][0]]++; con[R[i][1]]++; } for(i=0;i<N;i++) sort(Next[i].begin(),Next[i].end()); for(i=0;i<N;i++) { if(i==Next[Next[i][0].second][0].second&&con[Next[i][0].second]>1) in[1][Next[i][0].second]++; else in[0][Next[i][0].second]++; if(con[i]>1&&con[Next[i][1].second]>1&&i==Next[Next[i][1].second][0].second) in[1][Next[i][1].second]++; else if(con[i]>1) in[0][Next[i][1].second]++; con1[0][i]=-1; con1[1][i]=-1; con2[1][i]=-1; con2[0][i]=-1; cir1[0][i]=-1; cir1[1][i]=-1; cir2[1][i]=-1; cir2[0][i]=-1; } for(i=0;i<N;i++) { all.clear(); if(in[0][i]==0) F(0,i,0,-1,-1); all.clear(); if(in[1][i]==0&&con[i]>1) F(1,i,0,-1,-1); } for(i=0;i<N;i++) { all.clear(); if(have[0][i]==0) F(0,i,0,-1,-1); all.clear(); if(have[1][i]==0&&con[i]>1) F(1,i,0,-1,-1); } for(i=0;i<Q;i++) { ans=0; for(j=0;j<N;j++) { if(G[i]==con1[0][j]||G[i]==con2[0][j]) ans++; else if(cir1[0][j]!=-1&&con1[0][j]!=-1&&G[i]>=con1[0][j]&&(G[i]-con1[0][j])%cir1[0][j]==0) ans++; else if(cir2[0][j]!=-1&&con2[0][j]!=-1&&G[i]>=con2[0][j]&&(G[i]-con2[0][j])%cir2[0][j]==0) ans++; } answer((int) ans); } }

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

garden.cpp: In function 'void count_routes(int, int, int, int (*)[2], int, int*)':
garden.cpp:102:15: warning: unused variable 'k' [-Wunused-variable]
  102 |     int i=0,j,k,where,ans=0,real;
      |               ^
garden.cpp:102:17: warning: unused variable 'where' [-Wunused-variable]
  102 |     int i=0,j,k,where,ans=0,real;
      |                 ^~~~~
garden.cpp:102:29: warning: unused variable 'real' [-Wunused-variable]
  102 |     int i=0,j,k,where,ans=0,real;
      |                             ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...