제출 #378978

#제출 시각아이디문제언어결과실행 시간메모리
378978daniel920712Birthday gift (IZhO18_treearray)C++14
56 / 100
611 ms262148 KiB
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <vector> using namespace std; int deg[200005]; vector < int > Next[200005]; int Father[30][200005]={0}; int all[200005]; int now=1; struct A { int l,r; int nxl,nxr; int ans; }Node[200005]; void F(int here,int fa,int deg) { int j; ::deg[here]=deg; for(auto i:Next[here]) { if(i==fa) continue; Father[0][i]=here; for(j=1;j<25;j++) Father[j][i]=Father[j-1][Father[j-1][i]]; F(i,here,deg+1); } } int LCA(int a,int b) { int i; if(deg[a]<deg[b]) swap(a,b); for(i=20;i>=0;i--) if(deg[a]>deg[b]&&deg[a]-(1<<i)>=deg[b]) a=Father[i][a]; for(i=20;i>=0;i--) { if(deg[a]==deg[b]&&Father[i][a]!=Father[i][b]) { a=Father[i][a]; b=Father[i][b]; } } if(a==b) return a; if(Father[0][a]==Father[0][b]) return Father[0][a]; } void build(int l,int r,int here) { Node[here].l=l; Node[here].r=r; if(l==r) { Node[here].ans=all[l]; return; } Node[here].nxl=now++; Node[here].nxr=now++; build(l,(l+r)/2,Node[here].nxl); build((l+r)/2+1,r,Node[here].nxr); Node[here].ans=LCA(Node[Node[here].nxl].ans,Node[Node[here].nxr].ans); } void cha(int where,int con,int here) { if(where==Node[here].l&&where==Node[here].r) { Node[here].ans=con; return; } if(where<=(Node[here].l+Node[here].r)/2) cha(where,con,Node[here].nxl); else cha(where,con,Node[here].nxr); Node[here].ans=LCA(Node[Node[here].nxl].ans,Node[Node[here].nxr].ans); } int Find(int l,int r,int here) { if(Node[here].l==l&&Node[here].r==r) return Node[here].ans; if(r<=(Node[here].l+Node[here].r)/2) return Find(l,r,Node[here].nxl); else if(l>(Node[here].l+Node[here].r)/2) return Find(l,r,Node[here].nxr); else return LCA(Find(l,(Node[here].l+Node[here].r)/2,Node[here].nxl),Find((Node[here].l+Node[here].r)/2+1,r,Node[here].nxr)); } int main() { int N,M,Q,i,j,a,b,l,r,t,ok=0,tt,ll,rr; scanf("%d %d %d",&N,&M,&Q); for(i=1;i<N;i++) { scanf("%d %d",&a,&b); Next[a].push_back(b); Next[b].push_back(a); } F(1,-1,0); for(i=1;i<=M;i++) scanf("%d",&all[i]); build(1,M,0); while(Q--) { scanf("%d",&t); if(t==1) { scanf("%d %d",&l,&r); all[l]=r; cha(l,r,0); } else { scanf("%d %d %d",&l,&r,&t); ok=0; for(i=l;i<=r;i++) { if(all[i]==t) { printf("%d %d\n",i,i); ok=1; break; } } if(!ok) { ll=l; rr=l; now=all[l]; while(rr<r) { rr++; now=LCA(now,all[rr]); if(now==t) { printf("%d %d\n",ll,rr); ok=1; break; } while(ll<rr&&deg[now]<=deg[t]) { ll++; now=Find(ll,rr,0); } } } if(!ok) printf("-1 -1\n"); } } return 0; } /* 5 4 4 1 2 3 1 3 4 5 3 4 5 2 3 2 1 3 1 1 3 5 2 3 4 5 2 1 3 1 */

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

treearray.cpp: In function 'int main()':
treearray.cpp:81:17: warning: unused variable 'j' [-Wunused-variable]
   81 |     int N,M,Q,i,j,a,b,l,r,t,ok=0,tt,ll,rr;
      |                 ^
treearray.cpp:81:34: warning: unused variable 'tt' [-Wunused-variable]
   81 |     int N,M,Q,i,j,a,b,l,r,t,ok=0,tt,ll,rr;
      |                                  ^~
treearray.cpp: In function 'int LCA(int, int)':
treearray.cpp:45:1: warning: control reaches end of non-void function [-Wreturn-type]
   45 | }
      | ^
treearray.cpp: In function 'int main()':
treearray.cpp:82:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   82 |     scanf("%d %d %d",&N,&M,&Q);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~
treearray.cpp:85:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   85 |         scanf("%d %d",&a,&b);
      |         ~~~~~^~~~~~~~~~~~~~~
treearray.cpp:91:28: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   91 |     for(i=1;i<=M;i++) scanf("%d",&all[i]);
      |                       ~~~~~^~~~~~~~~~~~~~
treearray.cpp:95:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   95 |         scanf("%d",&t);
      |         ~~~~~^~~~~~~~~
treearray.cpp:98:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   98 |             scanf("%d %d",&l,&r);
      |             ~~~~~^~~~~~~~~~~~~~~
treearray.cpp:104:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  104 |             scanf("%d %d %d",&l,&r,&t);
      |             ~~~~~^~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...