Submission #217440

#TimeUsernameProblemLanguageResultExecution timeMemory
2174402fat2codeTraffickers (RMI18_traffickers)C++14
0 / 100
3594 ms28528 KiB
#include <bits/stdc++.h> #define ll long long #define ld long double #define all(a) (a).begin(), (a).end() //#pragma GCC optimize("O3") //#pragma GCC optimize("Ofast") //#pragma GCC taraget("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #define sz() size() #define fr first #define sc second #define pi pair<int,int> #define pii pair<pair<int,int>,int> #define int long long #define mp make_pair #define rc(s) return cout<<s,0 #define rcc(s) cout<<s,exit(0) using namespace std; const int mod=1e9+7; const int modp=1999999973; const int modulo=998244353; const int nmax=30005; int n,q,parinte[nmax],lca[nmax][23],aib[21][21][2*nmax],first[nmax],last[nmax],depth[nmax]; vector<int>nod[nmax],euler; void DFS(int s,int par,int lvl){ euler.push_back(s); parinte[s]=par; depth[s]=lvl; for(auto it:nod[s]){ if(it!=par){ DFS(it,s,lvl+1); euler.push_back(s); } } } int findLCA(int x, int y){ for(int j = 18; j >= 0; j--){ if(depth[x] - (1<<j) >= depth[y]){ x = lca[x][j]; } } if(x==y)return x; for(int j = 18; j >= 0; j--){ if(lca[y][j] && lca[x][j]!=lca[y][j]){ x = lca[x][j]; y = lca[y][j]; } } return lca[x][0]; } void update(int pos,int val,int aib[]){ while(pos<=euler.size()){ aib[pos]+=val; pos+=(pos&-pos); } } int sum(int pos,int aib[]){ int rs=0; while(pos){ rs+=aib[pos]; pos-=(pos&-pos); } return rs; } void query12(int x,int y,int type){ int lc=findLCA(x,y); vector<int>path; while(x!=lc){ path.push_back(x); x=parinte[x]; } vector<int>tz; while(y!=lc){ tz.push_back(y); y=parinte[y]; } tz.push_back(y); if(tz.size()) for(int i=tz.size()-1;i>=0;i--) path.push_back(tz[i]); for(int i=0;i<=19;i++){ int nod = path[i%path.size()]; if(type==1){ update(first[nod],1,aib[i][path.size()]); update(last[nod]+1,-1,aib[i][path.size()]); } else{ update(first[nod],-1,aib[i][path.size()]); update(last[nod]+1,1,aib[i][path.size()]); } } } int query3(int x,int y,int t1,int t2){ int cnt[20]; int lc=findLCA(x,y); for(int i=0;i<=19;i++) cnt[i]=0LL; int cnturr=20LL; while(t1<t2 && t1%cnturr!=0LL){ cnt[t1%(cnturr)]++; t1++; } while(t2>t1 && t2%(cnturr)!=19LL){ cnt[t2%(cnturr)]++; t2--; } if(t1==t2){ cnt[t1%(cnturr)]++; } else{ int curr=(t2-t1+1LL)/(cnturr); for(int i=0;i<=19;i++) cnt[i]+=curr; } int ans=0LL; for(int i=0;i<=19;i++){ for(int j=1;j<=20;j++){ int curr=cnt[i]*(sum(first[x],aib[i][j])+sum(first[y],aib[i][j])-sum(first[lc],aib[i][j])-sum(first[parinte[lc]],aib[i][j])); ans+=curr; } } return ans; } int32_t main(){ ios_base::sync_with_stdio(false);cin.tie(0);cerr.tie(0);cout.tie(0); srand(chrono::steady_clock::now().time_since_epoch().count()); cin >> n; for(int i=1;i<n;i++){ int x,y; cin >> x >> y; nod[x].push_back(y); nod[y].push_back(x); } DFS(1,-1,0); int pop=0; for(auto it:euler){ pop++; if(first[it]==0){ first[it]=pop; last[it]=pop; } else last[it]=pop; } for(int i=1;i<=n;i++) lca[i][0]=parinte[i]; for(int i=1;(1<<i)<=n;i++){ for(int j=1;j<=n;j++) lca[j][i]=lca[lca[j][i-1]][i-1]; } parinte[1]=0; cin >> q; for(int i=1;i<=q;i++){ int x,y; cin >> x >> y; query12(x,y,1); } cin >> q; int t=0; for(int i=1;i<=q;i++){ cin >> t; if(t==1 || t==2){ int x,y; cin >> x >> y; query12(x,y,t); } else{ int x,y,t1,t2; cin >> x >> y >> t1 >> t2; int pls = query3(x,y,t1,t2); cout << pls << '\n'; } } }

Compilation message (stderr)

traffickers.cpp: In function 'void update(long long int, long long int, long long int*)':
traffickers.cpp:59:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while(pos<=euler.size()){
           ~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...