Submission #1271410

#TimeUsernameProblemLanguageResultExecution timeMemory
1271410trandangquangConstruction of Highway (JOI18_construction)C++20
0 / 100
1 ms328 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 fi first #define se second #define pb push_back #define eb emplace_back #define ll long long 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; int n,c[N],a[N],b[N]; int sz[N],par[N],head[N],idCh[N],curCh,h[N]; vector<int> adj[N]; vector<int> rar; vector<ii> sigma[N]; void pre(int u){ sz[u]=1; for(int v:adj[u]){ par[v]=u; h[v]=h[u]+1; pre(v); sz[u]+=sz[v]; } } void hld(int u){ if(!head[curCh]){ head[curCh]=u; sigma[curCh].eb(0,0); } idCh[u]=curCh; sigma[idCh[u]].back().se++; int bigCh=-1; for(int v:adj[u]){ if(bigCh==-1 || sz[bigCh]<sz[v]) bigCh=v; } if(bigCh!=-1) hld(bigCh); for(int v:adj[u]) if(v!=bigCh){ ++curCh; hld(v); } } void upd(int x, int val){ while(x!=0){ int szNeed=h[x]-h[head[idCh[x]]]+1, tmp=szNeed; while(szNeed>0){ if(sigma[idCh[x]].back().se<=szNeed){ szNeed-=sigma[idCh[x]].back().se; sigma[idCh[x]].pop_back(); } else{ sigma[idCh[x]].back().se-=szNeed; szNeed=0; } } sigma[idCh[x]].eb(val,tmp); x=par[head[idCh[x]]]; } } int fw[N]; void updf(int id, int val){ for(; id<=n; id+=id&-id) fw[id]+=val; } int getf(int id){ int res=0; for(; id>0; id-=id&-id) res+=fw[id]; return res; } ll calc(int x){ ll res=0; vector<ii> hi; while(x!=0){ int szNeed=h[x]-h[head[idCh[x]]]+1; vector<ii> tmp; ford(i,sz(sigma[idCh[x]])-1,0){ if(szNeed==0) break; if(sigma[idCh[x]][i].se<=szNeed){ tmp.eb(sigma[idCh[x]][i]); szNeed-=sigma[idCh[x]][i].se; } else{ tmp.eb(sigma[idCh[x]][i].fi, szNeed); szNeed=0; } } reverse(all(tmp)); for(auto [col,num]:tmp){ res+=1LL*num*getf(col); updf(col,num); hi.eb(col,num); } x=par[head[idCh[x]]]; } for(auto [col,num]:hi) updf(col,-num); return res; } void solve(){ cin>>n; foru(i,1,n) cin>>c[i]; /// compress foru(i,1,n) rar.eb(c[i]); sort(all(rar)); rar.erase(unique(all(rar)),rar.end()); foru(i,1,n) c[i]=lower_bound(all(rar),c[i])-rar.begin()+1; /// build hld foru(i,1,n-1){ cin>>a[i]>>b[i]; adj[a[i]].eb(b[i]); } pre(1); hld(1); /// process upd(1,c[1]); foru(i,1,n-1){ cout<<calc(a[i])<<'\n'; upd(b[i],c[b[i]]); } } 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; rep(_,tc){ solve(); } }

Compilation message (stderr)

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