Submission #217456

#TimeUsernameProblemLanguageResultExecution timeMemory
2174562fat2codeTraffickers (RMI18_traffickers)C++17
100 / 100
2416 ms109936 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 int long long #define pii pair<pair<int,int>,int> #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],height[nmax]; vector<int>nod[nmax],euler; void DFS(int s,int par,int lvl){ euler.push_back(s); parinte[s]=par; height[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){ if(height[x]<height[y]) swap(x, y); int log1, log2; for(log1 = 1; (1 << log1) < height[x]; ++log1); for(log2 = 1; (1 << log2) < height[y]; ++log2); for(int k = log1; k >= 0; --k) if(height[x] - (1 << k) >= height[y]) x = lca[x][k]; if(x == y) return x; for(int k = log2; k >= 0; --k) if(lca[x][k] && lca[x][k] != lca[y][k]) x = lca[x][k], y = lca[y][k]; 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<path.size();i++){ int nod = path[i]; 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 timp){ if(timp==-1) return 0LL; int lc=findLCA(x,y); int ans=0; for(int i=1;i<=20;i++){ int cmp=(timp+1)/i; bool bo=false; for(int j=0;j<i;j++){ if((timp+1)%i>j){ bo=true; cmp++; } ans+=cmp*(sum(first[x],aib[j][i])+sum(first[y],aib[j][i])-sum(first[lc],aib[j][i])-sum(first[parinte[lc]],aib[j][i])); if(bo==true){ bo=false; cmp--; } } } 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; --t1; cout << query3(x,y,t2) - query3(x,y,t1) << '\n'; } } }

Compilation message (stderr)

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