Submission #928678

#TimeUsernameProblemLanguageResultExecution timeMemory
928678MilosMilutinovicStray Cat (JOI20_stray)C++14
100 / 100
49 ms15924 KiB
#include "Anthony.h" #include<bits/stdc++.h> using namespace std; namespace { const int seq[]={1,0,1,1,0,0}; int n,tot; int v[40005],nxt[40005],h[20005],d[20005],q[20005],idx[20005]; vector<int> ret; void addedge(int x,int y){ v[++tot]=y; nxt[tot]=h[x]; h[x]=tot; v[++tot]=x; nxt[tot]=h[y]; h[y]=tot; } void bfs(){ for(int i=0;i<n;i++) d[i]=-1; int front=0,rear=0; q[rear++]=0; d[0]=0; while(front<rear){ int x=q[front]; for(int p=h[x];p;p=nxt[p]){ if(d[v[p]]==-1){ d[v[p]]=d[x]+1; q[rear++]=v[p]; } } ++front; } } void dfs(int x,int fa,int lst,int i){ int ch=0; for(int p=h[x];p;p=nxt[p]) if(v[p]!=fa) ch++; if(ch==0) return; if(ch==1){ for(int p=h[x];p;p=nxt[p]){ if(v[p]==fa) continue; ret[idx[v[p]]]=seq[i]; dfs(v[p],x,seq[i],(i+1)%6); } }else{ for(int p=h[x];p;p=nxt[p]){ if(v[p]==fa) continue; ret[idx[v[p]]]=lst^1; dfs(v[p],x,lst^1,lst^1); } } } } vector<int> Mark(int n,int m,int a,int b,vector<int> u,vector<int> v){ ::n=n; tot=0; for(int i=0;i<n;i++) h[i]=0; for(int i=0;i<m;i++) addedge(u[i],v[i]); if(a>=3){ bfs(); vector<int> col(m); for(int i=0;i<m;i++) col[i]=min(d[u[i]],d[v[i]])%3; return col; }else{ bfs(); for(int i=0;i<m;i++){ if(d[u[i]]>d[v[i]]) swap(u[i],v[i]); idx[v[i]]=i; } ret.resize(m); dfs(0,0,0,0); return ret; } return vector<int>(m,0); }
#include "Catherine.h" #include<bits/stdc++.h> #define pb push_back using namespace std; namespace { const int seq[]={1,0,1,1,0,0}; int a,b; bool up; vector<int> edg,pth; bool Down(){ for(int i=0;i<6;i++){ bool ok=true; for(int j=0;j<(int)pth.size();j++){ if(seq[(i+j)%6]!=pth[j]) ok=false; } if(ok) return true; } return false; } } // namespace void Init(int A,int B){ a=A; b=B; up=false; edg.clear(); pth.clear(); } int Move(vector<int> y){ if(a>=3){ int cnt=0; for(int i=0;i<a;i++) cnt+=(y[i]>0?1:0); if(cnt==1){ for(int i=0;i<a;i++) if(y[i]>0) return i; } for(int i=0;i<a;i++){ if(y[i]>0&&y[(i+1)%3]>0) return i; } } if(up){ if(y[0]==0&&y[1]==0){ edg.pb(edg.back()); return -1; } if(y[0]==0){ assert(y[1]>0); edg.pb(1); return 1; } if(y[1]==0){ assert(y[0]>0); edg.pb(0); return 0; } int t=edg.back(); edg.pb(t^1); return t^1; } if(y[0]+y[1]+(!edg.empty()?1:0)==1){ up=true; if(!edg.empty()) y[edg.back()]++; for(int i=0;i<2;i++){ if(y[i]==1){ int v; if(!edg.empty()&&edg.back()==i) v=-1; else v=i; edg.pb(i); return v; } } assert(false); } if(y[0]+y[1]+(!edg.empty()?1:0)>2){ up=true; if(!edg.empty()) y[edg.back()]++; for(int i=0;i<2;i++){ if(y[i]==1){ int v; if(!edg.empty()&&edg.back()==i) v=-1; else v=i; edg.pb(i); return v; } } assert(false); } if((int)edg.size()<3){ if(y[0]==0){ edg.pb(1); pth.pb(1); if(y[1]==2) pth.pb(1); return 1; } if(y[1]!=0) pth.pb(1); else if(y[0]==2) pth.pb(0); edg.pb(0); pth.pb(0); return 0; } assert(y[0]+y[1]==1); if(y[0]==1) pth.pb(0); else assert(y[1]>0),pth.pb(1); if(Down()){ up=true; edg.pb(edg.back()); return -1; }else{ up=true; if(y[0]==1){ edg.pb(0); return 0; }else{ assert(y[1]>0); edg.pb(1); return 1; } } }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...