Submission #1299415

#TimeUsernameProblemLanguageResultExecution timeMemory
1299415trandangquangTwo Currencies (JOI23_currencies)C++20
100 / 100
808 ms40568 KiB
#include<bits/stdc++.h> using namespace std; #define foru(i,a,b) for(int i=(a); i<=(b); ++i) #define ford(i,a,b) for(int i=(a); i>=(b); --i) #define rep(i,a) for(int i=0; i<(a); ++i) #define sz(a) (int)(a).size() #define all(a) (a).begin(),(a).end() #define bit(s,i) (((s)>>(i))&1) #define ii pair<int,int> #define vi vector<int> #define vii vector<ii> #define fi first #define se second #define ll long long #define eb emplace_back #define pb push_back #define __builtin_popcount __builtin_popcountll #define _ << " " << template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;} template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;} const int N=1e5+5; const int LG=17; int n,m,q; vii adj[N]; int s[N],t[N],gol[N],lst[N]; ll sil[N]; struct checkPoint{ int idE, numSil; bool operator < (const checkPoint &o) const { return numSil < o.numSil; } } cp[N]; int up[N][LG+1],h[N],tin[N],tout[N],tim,idV[N]; void dfs(int u, int p=-1){ tin[u]=++tim; for(auto [v,id]:adj[u]) if(v!=p){ up[v][0]=u; foru(i,1,LG){ up[v][i]=up[up[v][i-1]][i-1]; } h[v]=h[u]+1; idV[id]=v; dfs(v,u); } tout[u]=tim; } int lca(int u, int v){ if(h[u]<h[v]) swap(u,v); int dd=h[u]-h[v]; foru(i,0,LG) if(bit(dd,i)) u=up[u][i]; if(u==v) return u; ford(i,LG,0) if(up[u][i]!=up[v][i]) u=up[u][i], v=up[v][i]; return up[u][0]; } int L[N],R[N],resG[N]; template<class T> struct BIT{ T f[N]; void reset(){ memset(f,0,sizeof(f)); } void upd(int id, T val){ for(; id<=n; id+=id&-id) f[id]+=val; } void upd(int l, int r, T val){ upd(l,val); upd(r+1,-val); } T get(int id){ T res=0; for(; id>0; id-=id&-id) res+=f[id]; return res; } }; BIT<int> totG; BIT<ll> totS; vi que[N]; void solve(){ cin>>n>>m>>q; foru(i,1,n-1){ int u,v; cin>>u>>v; adj[u].eb(v,i); adj[v].eb(u,i); } foru(i,1,m) cin>>cp[i].idE>>cp[i].numSil; foru(i,1,q) cin>>s[i]>>t[i]>>gol[i]>>sil[i]; dfs(1); sort(cp+1, cp+1+m); foru(i,1,q){ L[i]=0; R[i]=m; resG[i]=-1; lst[i]=lca(s[i],t[i]); } while(true){ totG.reset(); totS.reset(); foru(i,0,m) que[i].clear(); bool chk=0; foru(i,1,q){ if(L[i]<=R[i]){ int M=(L[i]+R[i])>>1; que[M].eb(i); chk=1; } } if(!chk) break; foru(i,1,m){ int v=idV[cp[i].idE]; totG.upd(tin[v],tout[v],1); } foru(i,0,m){ if(i>0){ int v=idV[cp[i].idE]; totG.upd(tin[v],tout[v],-1); totS.upd(tin[v],tout[v],cp[i].numSil); } for(int j:que[i]){ ll tot=totS.get(tin[s[j]]) + totS.get(tin[t[j]]) - 2*totS.get(tin[lst[j]]); int M=(L[j]+R[j])>>1; if(tot<=sil[j]){ resG[j]=totG.get(tin[s[j]]) + totG.get(tin[t[j]]) - 2*totG.get(tin[lst[j]]); L[j]=M+1; } else{ R[j]=M-1; } } } } foru(i,1,q){ if(resG[i]>gol[i]){ cout<<"-1\n"; } else{ cout<<gol[i]-resG[i]<<'\n'; } } } int32_t main(){ #define task "test" if(fopen(task".inp", "r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } cin.tie(0)->sync_with_stdio(0); int tc=1; //cin>>tc; foru(i,1,tc){ solve(); } }

Compilation message (stderr)

currencies.cpp: In function 'int32_t main()':
currencies.cpp:159:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  159 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
currencies.cpp:160:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  160 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...