Submission #132610

#TimeUsernameProblemLanguageResultExecution timeMemory
132610hamzqq9Designated Cities (JOI19_designated_cities)C++14
100 / 100
1041 ms75192 KiB
#include<bits/stdc++.h>
#define st first
#define nd second
#define pb push_back
#define ppb pop_back
#define ii pair<int,int>
#define ll long long
#define orta ((bas+son)>>1)
#define sz(x) ((int)x.size())
#define all(x) x.begin(),x.end()
#define umin(x,y) x=min(x,y)
#define umax(x,y) x=max(x,y)
#define inf 2000000000000000
#define N 200005
#define MOD 998244353
#define KOK 700		
using namespace std;

int tut21,tut22,n;
ll sub[N],mn,mn2;
vector<int> v[N];
ii e[N*2];
ll ans[N];
vector<pair<ll,int>> deep[N];

struct solve {

	int root;
	int t;
	int u[N],be[N],en[N],tut[N],dae[N],dad[N];
	ll dep[N];
	ll lazy[N*4];
	pair<ll,int> S[N*4];

	void shift(int node,ll val) {

		S[node].st+=val;
		lazy[node]+=val;

	}

	void push(int node) {

		shift(node<<1,lazy[node]);
		shift(node<<1|1,lazy[node]);

		lazy[node]=0;

	}

	void up(int node,int bas,int son,int l,int r,ll val) {

		if(bas>r || son<l) return ;

		if(bas>=l && son<=r) {

			shift(node,val);

			return ;

		}

		push(node);

		up(node<<1,bas,orta,l,r,val);
		up(node<<1|1,orta+1,son,l,r,val);

		S[node]=max(S[node<<1],S[node<<1|1]);

	}

	void build(int node,int bas,int son) {

		if(bas==son) {

			S[node]={dep[tut[bas]],tut[bas]};

			return ;

		}

		build(node<<1,bas,orta);
		build(node<<1|1,orta+1,son);

		S[node]=max(S[node<<1],S[node<<1|1]);

	}

	void dfs(int node,int ata) {

		be[node]=++t;
		tut[t]=node;

		for(int i:v[node]) {

			if(e[i].st==ata) continue ;

			dep[e[i].st]=dep[node]+e[i].nd;
			dae[e[i].st]=e[i].nd;
			dad[e[i].st]=node;

			dfs(e[i].st,node);

		}

		en[node]=t;

	}

	void build() {

		memset(u,0,sizeof(u));
		memset(lazy,0,sizeof(lazy));

		t=dep[root]=0;

		dfs(root,0);

		dep[root]=-inf;
		u[root]=1;

		build(1,1,n);

	}

	void update(int node) {

		while(!u[node]) {

		//	cerr<<node<<"\n";

			up(1,1,n,be[node],be[node],-inf);
			up(1,1,n,be[node]+1,en[node],-dae[node]);

			u[node]=1;

			node=dad[node];

		}

		//cerr<<"done\n";

		//exit(0);

	}

	pair<ll,int> getnext() {

		return S[1];

	}

	bool check() {

		//if(S[1].st>0) cerr<<S[1].nd<<"\n";

		return S[1].st>0;

	}

} solver;

void up(int node,pair<ll,int> val,int add) {

	val.st+=add;

	deep[node].pb(val);

	for(int i=sz(deep[node])-1;i>0;i--) {

		if(deep[node][i]>deep[node][i-1]) swap(deep[node][i],deep[node][i-1]);
 
	}

	if(sz(deep[node])>2) deep[node].ppb();

}

void dfs(int node,int ata,ll u) {

	if(sub[node]+u<mn) {

		mn=sub[node]+u;

	}

	if(sz(deep[node])>1) {

		if(sub[node]+u-deep[node][0].st-deep[node][1].st<mn2) {

			mn2=sub[node]+u-deep[node][0].st-deep[node][1].st;
			tut21=deep[node][0].nd;
			tut22=deep[node][1].nd;

		}

	}

	if(sub[node]+u-deep[node][0].st<mn2) {

		mn2=sub[node]+u-deep[node][0].st;
		tut21=deep[node][0].nd;
		tut22=node;

	}

	for(int i:v[node]) {

		if(e[i].st==ata) continue ;

		dfs(e[i].st,node,u+sub[node]-(sub[e[i].st]+e[i].nd)+e[i^1].nd);

	}
 
}

void dfs(int node,int ata) {

	for(int i:v[node]) {

		if(e[i].st==ata) continue ;

		dfs(e[i].st,node);

		up(node,deep[e[i].st][0],e[i].nd);

		sub[node]+=sub[e[i].st]+e[i].nd;

	}

	up(node,{0,node},0);

}

int main() {

	scanf("%d",&n);

	int ecnt=0;

	for(int i=0;i<n-1;i++) {

		int a,b,c,d;

		scanf("%d %d %d %d",&a,&b,&c,&d);

		e[ecnt]={b,c};
		e[ecnt^1]={a,d};

		v[a].pb(ecnt);
		v[b].pb(ecnt^1);

		ecnt+=2;

	}

	dfs(1,0);
	mn=mn2=inf;
	dfs(1,0,0);

	ans[1]=mn;
	ans[2]=mn2;

	solver.root=tut21;
	solver.build();

	solver.update(tut22);

	int cnt=2;

	while(solver.check()) {

		pair<ll,int> res=solver.getnext();

		ans[cnt+1]=ans[cnt]-res.st;

		++cnt;

		solver.update(res.nd);

	}

	ll last=ans[cnt];

	while(++cnt<=n) {

		ans[cnt]=last;

	}

	int q;

	scanf("%d",&q);

	while(q--) {

		int x;

		scanf("%d",&x);

		printf("%lld\n",ans[x]);

	}
 
}

Compilation message (stderr)

designated_cities.cpp: In function 'int main()':
designated_cities.cpp:237:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
  ~~~~~^~~~~~~~~
designated_cities.cpp:245:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d %d",&a,&b,&c,&d);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
designated_cities.cpp:293:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&q);
  ~~~~~^~~~~~~~~
designated_cities.cpp:299:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d",&x);
   ~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...