Submission #58887

#TimeUsernameProblemLanguageResultExecution timeMemory
58887TadijaSebezConstruction of Highway (JOI18_construction)C++11
100 / 100
500 ms90284 KiB
#include <stdio.h> #include <vector> #include <algorithm> using namespace std; #define pb push_back #define mp make_pair #define ll long long const int N=100050; vector<int> E[N]; int c[N]; struct BIT { int sum[N]; vector<int> use; void init(){ for(int i=0;i<use.size();i++) sum[use[i]]=0;use.clear();} BIT(){} void Set(int i, int x){ for(;i<N;i+=i&-i){ if(!sum[i]) use.pb(i);sum[i]+=x;}} int Get(int i){ int ret=0;for(;i;i-=i&-i) ret+=sum[i];return ret;} } Tree; int sz[N],head[N],dep[N],par[N]; vector<pair<int,int> > all[N]; void DFS(int u, int p) { dep[u]=dep[p]+1; par[u]=p; sz[u]=1; for(int i=0;i<E[u].size();i++) { int v=E[u][i]; if(v!=p) DFS(v,u),sz[u]+=sz[v]; } } void HLD(int u, int p) { if(!p) head[u]=u; int HC=0,i; for(i=0;i<E[u].size();i++) { int v=E[u][i]; if(v!=p && sz[v]>sz[HC]) HC=v; } for(i=0;i<E[u].size();i++) { int v=E[u][i]; if(v!=p) { if(v==HC) head[v]=head[u]; else head[v]=v; HLD(v,u); } } } ll Query(int u, int v) { ll ans=0; int col=c[v]; vector<pair<int,int> > work; while(u) { int len=dep[u]-dep[head[u]]+1; int chain=head[u]; work.clear(); while(all[chain].size() && len>=all[chain].back().first) { work.pb(all[chain].back()); len-=all[chain].back().first; all[chain].pop_back(); } if(all[chain].size() && len>0) { work.pb(mp(len,all[chain].back().second)); all[chain][all[chain].size()-1].first-=len; } while(work.size()) { ans+=(ll)work.back().first*Tree.Get(work.back().second-1); Tree.Set(work.back().second,work.back().first); //printf("del:%i %i\n",work.back().first,work.back().second); work.pop_back(); } u=par[head[u]]; } while(v) { int push=dep[v]-dep[head[v]]+1; all[head[v]].pb(mp(push,col)); //printf("add:%i %i\n",push,col); //printf("%i %i %i %i\n",head[v],v,push,col); v=par[head[v]]; } Tree.init(); return ans; } vector<int> id; int Find(int x){ return lower_bound(id.begin(),id.end(),x)-id.begin()+1;} int a[N],b[N]; int main() { int n,i,u,v; scanf("%i",&n); for(i=1;i<=n;i++) scanf("%i",&c[i]),id.pb(c[i]); sort(id.begin(),id.end()); id.erase(unique(id.begin(),id.end()),id.end()); for(i=1;i<=n;i++) c[i]=Find(c[i]); for(i=1;i<n;i++) scanf("%i %i",&u,&v),E[u].pb(v),a[i]=u,b[i]=v; DFS(1,0); HLD(1,0); all[1].pb(mp(1,c[1])); for(i=1;i<n;i++) printf("%lld\n",Query(a[i],b[i])); return 0; }

Compilation message (stderr)

construction.cpp: In member function 'void BIT::init()':
construction.cpp:15:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  void init(){ for(int i=0;i<use.size();i++) sum[use[i]]=0;use.clear();}
                           ~^~~~~~~~~~~
construction.cpp: In function 'void DFS(int, int)':
construction.cpp:27:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<E[u].size();i++)
              ~^~~~~~~~~~~~
construction.cpp: In function 'void HLD(int, int)':
construction.cpp:37:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0;i<E[u].size();i++)
          ~^~~~~~~~~~~~
construction.cpp:42:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0;i<E[u].size();i++)
          ~^~~~~~~~~~~~
construction.cpp: In function 'int main()':
construction.cpp:100:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%i",&n);
  ~~~~~^~~~~~~~~
construction.cpp:101:37: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(i=1;i<=n;i++) scanf("%i",&c[i]),id.pb(c[i]);
                    ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
construction.cpp:105:57: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(i=1;i<n;i++) scanf("%i %i",&u,&v),E[u].pb(v),a[i]=u,b[i]=v;
                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...