제출 #1004818

#제출 시각아이디문제언어결과실행 시간메모리
1004818modwweTourism (JOI23_tourism)C++17
0 / 100
5096 ms23532 KiB
///https://www.instagram.com/_modwwe/ #include<bits/stdc++.h> //#define int long long //#define ll long long #define down cout<<'\n'; #define NHP ios_base::sync_with_stdio(0);cout.tie(0);cin.tie(0); #define modwwe int t;cin>>t; while(t--) #define bit(i,j) (i>>j&1) #define sobit(a) __builtin_popcountll(a) #define task "test" #define fin(x) freopen(x".inp","r",stdin) #define fou(x) freopen(x".out","w",stdout) #define pb push_back #define checktime cerr << (double)clock() / CLOCKS_PER_SEC * 1000 << " ms"; using namespace std; void phongbeo(); const int inf=1e18; const int mod2=1e9+7; const int mod1=998244353; struct icd { int a,b; }; struct ib { int a; int b; }; struct ic { int a,b,c; }; struct id { int a,b,c,d; }; struct ie { int a,b,c, d,e,f; }; int n,m,s1,s2,s4,s3,sf,k,r,mid,s5,s6,mx,s7,s8,s9,mx2,res,dem2=0,dem=0,l; int i,s10,s12; int el=29; main() { #ifndef ONLINE_JUDGE // fin(task),fou(task); #endif NHP /// cin>>s1; // modwwe phongbeo(); } ic t[400007]; int depth[100007]; ic a[100007]; int c[100007]; ib euler[100007]; int d[100007]; int st[17][100007]; int ans[1000007]; int S; int b[100007]; vector<int> v[100007]; int e[100007]; int lz[400007]; bool cmp(ic a,ic b) { if(a.a/S==b.a/S) return a.b<b.b; return a.a/S<b.a/S; } void build(int node,int l,int r) { t[node].b= n+1; if(l==r)return; int mid=l+r>>1; build(node<<1,l,mid); build(node<<1|1,mid+1,r); } void upd(int node,int l,int r,int l1,int r1,int cc) { if(l>r1||r<l1) return; if(l>=l1&&r<=r1) { t[node].c+=cc; if(t[node].c>0) t[node]= {l,r,t[node].c}; else t[node]= {0,n+1,0}; return; } int mid=l+r>>1; upd(node<<1,l,mid,l1,r1,cc); upd(node<<1|1,mid+1,r,l1,r1,cc); t[node].a=max(t[node<<1].a,t[node<<1|1].a); t[node].b=min(t[node<<1].b,t[node<<1|1].b); } int get1(int node,int l,int r,int l1,int r1) { if(l>r1||r<l1) return 0; if(l>=l1&&r<=r1) return t[node].a; int mid=l+r>>1; return max(get1(node<<1,l,mid,l1,r1),get1(node<<1|1,mid+1,r,l1,r1)); } int get2(int node, int l,int r,int l1,int r1) { if(l>r1||r<l1) return n+1; if(l>=l1&&r<=r1) return t[node].b; int mid=l+r>>1; return min(get2(node<<1,l,mid,l1,r1),get2(node<<1|1,mid+1,r,l1,r1)); } void dfs(int x,int y) { st[0][x]=y; depth[x]=depth[y]+1; euler[x].a=++dem; c[dem]=x; for(auto f:v[x]) if(f!=y) dfs(f,x); euler[x].b=dem; } int lca(int x,int y,int cc) { if(x==0||x==n+1||y==0||y==n+1) return 1; if(depth[x]<depth[y]) swap(x,y),cc=0; int ss=depth[x]-depth[y]-1; if(ss>=0) for(int j=0; j<17; j++) if(bit(ss,j)) x=st[j][x]; if(st[0][x]==y) return x; if(ss!=-1) x=st[0][x]; for(int j=16; j>=0; --j) if(st[j][x]!=st[j][y]) x=st[j][x],y=st[j][y]; if(cc==0) return y; else return x; } int lca2(int x,int y) { if(x==0 )return y; if(y==0 )return x; if(depth[x]<depth[y]) swap(x,y); int ss=depth[x]-depth[y]; for(int j=0; j<17; j++) if(bit(ss,j)) x=st[j][x]; if(x==y) return x; for(int j=16; j>=0; --j) if(st[j][x]!=st[j][y]) x=st[j][x],y=st[j][y]; return st[0][x]; } void build2(int node,int l,int r) { if(l==r) { lz[node]=b[l]; return; } int mid=l+r>>1; build2(node<<1,l,mid); build2(node<<1|1,mid+1,r); lz[node]=lca2(lz[node<<1],lz[node<<1|1]); } int get_lca(int node,int l,int r,int l1,int r1) { if(l>r1||r<l1) return 0; if(l>=l1&&r<=r1) return lz[node]; int mid=l+r>>1; return lca2(get_lca(node<<1,l,mid,l1,r1),get_lca(node<<1|1,mid+1,r,l1,r1)); } void add(int x) { s2=get1(1,1,n,1,euler[x].a); s3=get2(1,1,n,euler[x].a,n); upd(1,1,n,euler[x].a,euler[x].a,1); s2=c[s2]; s3=c[s3]; if(s2==x||s3==x) return; s2=lca(x,s2,1); s3=lca(x,s3,1); if(depth[s2]<depth[s3]) swap(s2,s3); if(depth[x]>=depth[s2]) { s4+=depth[x]-depth[s2]+1; d[x]=s2; e[s2]=x; } } void del(int x) { upd(1,1,n,euler[x].a,euler[x].a,-1); s5=d[x]; if(d[x]==0) return; s2=get1(1,1,n,euler[s5].a,euler[x].a); s3=get2(1,1,n,euler[x].a,euler[s5].b); s2=c[s2]; s3=c[s3]; if(s2==x||s3==x) return; s4-=(depth[x]-depth[s5]+1); if(s2==0&&s3==0) return; e[s5]=0; d[x]=0; s9=s2; s2=lca(s2,x,1); s3=lca(s3,x,1); if(st[0][s2]==s9&&depth[s2]>=depth[s3]&&d[s2]==0) { s2=s9; s4+=depth[s2]-depth[s5]+1; d[s2]=s5; e[s5]=s2; return; } if(depth[s2]<depth[s3])swap(s2,s3); if(depth[s5]<depth[s2]) { s3=e[s2]; e[s2]=0; e[s5]=s3; d[s3]=s5; s4+=(depth[s2]-depth[s5]); } } void del2(int x) { upd(1,1,n,euler[x].a,euler[x].a,-1); s5=d[x]; if(d[x]==0) return; s2=get1(1,1,n,euler[s5].a,euler[x].a); s3=get2(1,1,n,euler[x].a,euler[s5].b); s2=c[s2]; s3=c[s3]; if(s2==x||s3==x) return; s4-=(depth[x]-depth[s5]+1); if(s2==0&&s3==0) return; e[s5]=0; d[x]=0; s9=s2; s2=lca(s2,x,1); s3=lca(s3,x,1); if(st[0][s2]==s9&&depth[s2]>=depth[s3]&&d[s2]==0) { s2=s9; s4+=depth[s2]-depth[s5]+1; d[s2]=s5; e[s5]=s2; return; } if(depth[s2]<depth[s3])swap(s2,s3); if(depth[s5]<depth[s2]) { s3=e[s2]; e[s2]=0; e[s5]=s3; d[s3]=s5; s4+=(depth[s2]-depth[s5]); } } void go(int x,int y) { while(r<y) { r++; add(b[r]); } while(l>x) { l--; add(b[l]); } while(l<x) { del(b[l]); // cout<<l<<" "<<s4,down l++; } while(r>y) { del(b[r]); r--; } } void phongbeo() { cin>>n>>m>>k; S=400; for(int i=1; i<n; i++) cin>>l>>r,v[l].pb(r),v[r].pb(l); dfs(1,0); for(int i=1; i<17; i++) for(int j=1; j<=n; j++) st[i][j]=st[i-1][st[i-1][j]]; for(int i=1; i<=m; i++) cin>>b[i]; for(int i=1; i<=k; i++) cin>>a[i].a>>a[i].b,a[i].c=i; sort(a+1,a+1+k,cmp); l=1; r=0; build(1,1,n); build2(1,1,m); for(int i=1; i<=k; i++) { // cout<<a[i].c<<" cucu"<<" "<<l<<" "<<r,down go(a[i].a,a[i].b); s3=get_lca(1,1,m,a[i].a,a[i].b); ans[a[i].c]=s4+depth[1]-depth[s3]; } for(int i=1; i<=k; i++) cout<<ans[i],down } /* 8 8 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 6 4 3 5 2 4 7 2 8 */

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

tourism.cpp:17:15: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   17 | const int inf=1e18;
      |               ^~~~
tourism.cpp:45:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   45 | main()
      | ^~~~
tourism.cpp: In function 'void build(int, int, int)':
tourism.cpp:77:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   77 |     int mid=l+r>>1;
      |             ~^~
tourism.cpp: In function 'void upd(int, int, int, int, int, int)':
tourism.cpp:92:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   92 |     int mid=l+r>>1;
      |             ~^~
tourism.cpp: In function 'int get1(int, int, int, int, int)':
tourism.cpp:103:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  103 |     int mid=l+r>>1;
      |             ~^~
tourism.cpp: In function 'int get2(int, int, int, int, int)':
tourism.cpp:110:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  110 |     int mid=l+r>>1;
      |             ~^~
tourism.cpp: In function 'void build2(int, int, int)':
tourism.cpp:164:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  164 |     int mid=l+r>>1;
      |             ~^~
tourism.cpp: In function 'int get_lca(int, int, int, int, int)':
tourism.cpp:173:14: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  173 |     int mid=l+r>>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...