제출 #359996

#제출 시각아이디문제언어결과실행 시간메모리
359996keta_tsimakuridzeConstruction of Highway (JOI18_construction)C++14
0 / 100
8 ms2944 KiB
#include<bits/stdc++.h>
#define int long long
#define ll long long
#define f first
#define s second
using namespace std;
const int N=1e5+5;
int sz[N],par[N],lazy[4*N],ind[N],c[N],cur,idx,k,i,a[N],b[N],n,st[N],f[N],ch[N],s[N];
pair<int,int>d[N],tree[4*N];
vector<int>V[N];
void dfs(int u,int p){
	sz[u]=1; par[u]=p;
	for(int i=0;i<V[u].size();i++){
		if(V[u][i]!=p) dfs(V[u][i],u),sz[u]+=sz[V[u][i]];
	}
}

void update(int u,int start,int end,int l,int r,int val){
	if(lazy[u]){
		tree[u]={lazy[u],lazy[u]};
		if(l!=r){
			lazy[2*u]=lazy[u];
			lazy[2*u+1]=lazy[u];
		}
		lazy[u]=0;
	}
	if(l>end || r<start) return;
	if(start<=l && r<=end) {
		tree[u]={val,val};
		if(l!=r){
			lazy[2*u]=val;
			lazy[2*u+1]=val;
		}
		return;
	}
	int mid=(l+r)/2;
	update(2*u,start,end,l,mid,val);
	update(2*u+1,start,end,mid+1,r,val);
	tree[u].f=min(tree[2*u].f,tree[2*u+1].f);
	tree[u].s=max(tree[2*u].s,tree[2*u+1].s);
}
pair<int,int> getans(int u,int start,int end,int l,int r){
	if(lazy[u]){
		tree[u]={lazy[u],lazy[u]};
		if(l!=r){
			lazy[2*u]=lazy[u];
			lazy[2*u+1]=lazy[u];
		}
		lazy[u]=0;
	}
	if(l>end || r<start) return {n+1,0};
	if(start<=l && r<=end) {
		return tree[u];
	}
	int mid=(l+r)/2;
	pair<int,int> g1=getans(2*u,start,end,l,mid);
	pair<int,int> g2=getans(2*u+1,start,end,mid+1,r);
	return {min(g1.f,g2.f),max(g1.s,g2.s)};
}
void hld(int u,int p){
	if(!st[cur]) st[cur]=u;
	idx++;
	ind[u]=idx; s[idx]=u;
	ch[u]=cur;
	int mx=0,v=0;
	for(int i=0;i<V[u].size();i++){
		if(V[u][i]==p) continue;
		if(mx<sz[V[u][i]]) {
			mx=sz[V[u][i]];
			v=V[u][i];
		}
	}
	if(v) hld(v,u);
	for(int i=0;i<V[u].size();i++){
		if(V[u][i]==p || V[u][i]==v) continue;
		cur++;
		hld(V[u][i],u);
	}
}
void update(int ind,int val){
	for(ind;ind<=n;ind+=ind&(-ind))
	f[ind]+=val;
}
ll getans(int ind){
	ll pas=0;
	for(ind;ind>=1;ind-=ind&(-ind))
	pas+=f[ind];
	return pas;
}
ll upd(int u,int val){
	vector<pair<int,int> >v;
	long long ans = 0,U=u;
	update(1,ind[u],ind[u],1,n,val);
	u=par[u];
	while(u){
		int l=ind[st[ch[u]]],r=ind[u],col=0;

		while(l<=r){
			int mid=(l+r)/2;
			pair<int,int> g=getans(1,mid,ind[u],1,n);
			if(g.first==g.second) {
				idx=mid; col=g.first; r=mid-1; 
			}
			else l=mid+1;
		} 
		update(1,idx,ind[u],1,n,val);
		ans += getans(col-1) *(ll)(-idx+ind[u]+1);
		update(col,-idx+ind[u]+1);
		v.push_back({col,-idx+ind[u]+1});
		u=par[s[idx]];
	}
	for(int i=0;i<v.size();i++){
		update(v[i].f,-v[i].s);
	}
	return ans;
}
 main(){
	cin>>n;
	for(k=1;k<=n;k++){
		cin>>c[k]; d[k]={c[k],k};
	}
	sort(d+1,d+n+1);
	cur=0;
	for(k=1;k<=n;k++){
		if(d[k]!=d[k-1]) cur++;
		c[d[k].second]=cur;
	}
	cur=1;
	for(k=1;k<n;k++){
		cin>>a[k]>>b[k];
		V[a[k]].push_back(b[k]);
		V[b[k]].push_back(a[k]);
	}
	dfs(1,0);
	hld(1,0);
	update(1,ind[1],ind[1],1,n,c[1]);
	for(k=1;k<n;k++){
		cout<<upd(b[k],c[b[k]])<<endl;
		
	}
}

컴파일 시 표준 에러 (stderr) 메시지

construction.cpp: In function 'void dfs(long long int, long long int)':
construction.cpp:13:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 |  for(int i=0;i<V[u].size();i++){
      |              ~^~~~~~~~~~~~
construction.cpp: In function 'void hld(long long int, long long int)':
construction.cpp:66:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |  for(int i=0;i<V[u].size();i++){
      |              ~^~~~~~~~~~~~
construction.cpp:74:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |  for(int i=0;i<V[u].size();i++){
      |              ~^~~~~~~~~~~~
construction.cpp: In function 'void update(long long int, long long int)':
construction.cpp:81:6: warning: statement has no effect [-Wunused-value]
   81 |  for(ind;ind<=n;ind+=ind&(-ind))
      |      ^~~
construction.cpp: In function 'long long int getans(long long int)':
construction.cpp:86:6: warning: statement has no effect [-Wunused-value]
   86 |  for(ind;ind>=1;ind-=ind&(-ind))
      |      ^~~
construction.cpp: In function 'long long int upd(long long int, long long int)':
construction.cpp:112:15: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  112 |  for(int i=0;i<v.size();i++){
      |              ~^~~~~~~~~
construction.cpp:92:20: warning: unused variable 'U' [-Wunused-variable]
   92 |  long long ans = 0,U=u;
      |                    ^
construction.cpp: At global scope:
construction.cpp:117:7: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  117 |  main(){
      |       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...