Submission #853792

#TimeUsernameProblemLanguageResultExecution timeMemory
853792TimDeeTraffickers (RMI18_traffickers)C++17
25 / 100
410 ms524292 KiB
// Esti <3 //\ šťastia pre nás :) // you're already the best // _ // ^ ^ // // >(O_O)<___// // \ __ __ \ // \\ \\ \\\\ #include <bits/stdc++.h> using namespace std; //#pragma GCC optimize("O3","unroll-loops") //#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #pragma GCC optimize("O3") #pragma GCC target("popcnt") using ll = long long; //#define int long long #define forn(i,n) for(int i=0; i<(n); ++i) #define pb push_back #define pi pair<int,int> #define f first #define s second #define vii(a,n) vector<int> a(n); forn(i,n) cin>>a[i]; #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); const int inf = 1e18; const int mod = 1e9+7;//998244353; // \ \ :smiling_face_with_3_hearts: :smiling_face_with_3_hearts: :smiling_face_with_3_hearts: //vidime sa veľmi skoro, moje slnko const int N = 3e4+5; int t[21][21][N]; void add(int i, int j, int k, int x) { for(;k<N;k|=k+1) t[i][j][k]+=x; } int sum(int i, int j, int r) { int q=0; for(;r>=0;r=(r&(r+1))-1) q+=t[i][j][r]; return q; } int par[N], top[N], sz[N], d[N]; int ind[N], inv[N]; int nxt=0; vector<int> adj[N]; void dfs(int u, int p) { par[u]=p; sz[u]=1; for(auto&v:adj[u]) { if (v==p) continue; d[v]=d[u]+1; dfs(v,u); sz[u]+=sz[v]; } } void dfs(int u, int p, int t) { ind[u]=nxt++; inv[ind[u]]=u; top[u]=t; int mx=-1; for(auto&v:adj[u]) { if (v==p) continue; if (mx==-1) mx=v; if (sz[v] > sz[mx]) v=mx; } if (mx==-1) return; dfs(mx,u,t); for(auto&v:adj[u]) { if (v==p || v==mx) continue; dfs(v,u,v); } } int lca(int u, int v) { while (top[u]!=top[v]) { if (d[top[u]] < d[top[v]]) swap(u,v); u=par[top[u]]; } if (d[u]>d[v]) swap(u,v); return u; } void qadd(int u, int v, int z) { int l = lca(u,v); vector<int> f,s; while (u!=l) { f.pb(u); u=par[u]; } f.pb(u); while (v!=l) { s.pb(v); v=par[v]; } reverse(all(s)); for(auto&x:s) f.pb(x); int k=f.size(); forn(i,k) { int u = f[i]; for (int j=i; j<k; ++j) add(k,j,ind[u],z); add(k,20,ind[u],z); } } ll qry(int u, int t) { ll ans=0; vector<int> rem(20), div(20); forn(i,20) rem[i] = t%(i+1); forn(i,20) div[i] = t/(i+1); while (u>=0) { forn(i,20) { int x = sum(i+1,rem[i],ind[u]) - sum(i+1,rem[i],ind[top[u]]-1); ans+=x; int y = sum(i+1,20,ind[u]) - sum(i+1,20,ind[top[u]]-1); ans+=1ll*y*div[i]; } u=par[top[u]]; } return ans; } ll query(int u, int v, int t) { if (t<0) return 0; ll ans = 0; int l = lca(u,v); ans += qry(u,t); ans += qry(v,t); ans -= 2ll*qry(l,t); vector<int> rem(20), div(20); forn(i,20) rem[i]=t%(i+1), div[i]=t/(i+1); forn(i,20) { int x = sum(i+1,rem[i],ind[l]) - sum(i+1,rem[i],ind[l]-1); ans+=x; int y = sum(i+1,20,ind[l]) - sum(i+1,20,ind[l]-1); ans+=1ll*y*div[i]; } return ans; } void solve() { int n; cin>>n; forn(i,n-1) { int u,v; cin>>u>>v; --u, --v; adj[u].pb(v); adj[v].pb(u); } dfs(0,-1); dfs(0,-1,0); //forn(i,n) cout<<i<<' '<<ind[i]<<' '<<top[i]<<' '<<par[i]<<'\n'; int k; cin>>k; forn(i,k) { int u,v; cin>>u>>v; --u, --v; qadd(u,v,1); } int q; cin>>q; forn(i,q) { int t; cin>>t; if (t==1) { int u,v; cin>>u>>v; --u, --v; qadd(u,v,1); } else if (t==2) { int u,v; cin>>u>>v; --u, --v; qadd(u,v,-1); } else { int u,v,a,b; cin>>u>>v>>a>>b; --u, --v; ll ans = query(u,v,b); ans -= query(u,v,a-1); cout<<ans<<'\n'; } } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t=1; //cin>>t; while (t--) solve(); return 0; }

Compilation message (stderr)

traffickers.cpp:3:1: warning: multi-line comment [-Wcomment]
    3 | //\
      | ^
traffickers.cpp:9:1: warning: multi-line comment [-Wcomment]
    9 | //   \ __ __  \
      | ^
traffickers.cpp:36:1: warning: multi-line comment [-Wcomment]
   36 | // \
      | ^
traffickers.cpp:33:17: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   33 | const int inf = 1e18;
      |                 ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...