2018 ACM-ICPC World Finals Gym-102482C Conquer the World

题目传送门

分析:
费用流,然而不会优化,在线膜拜大佬的博客OrzOrzOrz

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>

#define maxn 1000005
#define INF (1ll<<40)
#define MOD 998244353

using namespace std;

inline int getint()
{
	int num=0,flag=1;char c;
	while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
	while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
	return num*flag;
}

int n,m;
priority_queue<long long,vector<long long>,greater<long long> >Q1[maxn],Q2[maxn];
int A1[maxn],A2[maxn];
int fir[maxn],nxt[maxn],to[maxn],len[maxn],cnt;
long long dis[maxn],ans;

inline void newnode(int u,int v,int w)
{to[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt,len[cnt]=w;}

inline void merge(int x,int y)
{
	if(Q1[x].size()<Q1[y].size())swap(Q1[x],Q1[y]);
	while(!Q1[y].empty())Q1[x].push(Q1[y].top()),Q1[y].pop();
	if(Q2[x].size()<Q2[y].size())swap(Q2[x],Q2[y]);
	while(!Q2[y].empty())Q2[x].push(Q2[y].top()),Q2[y].pop();
}

inline void dfs(int u,int fa)
{
	while(A1[u]--)Q1[u].push(dis[u]);
	while(A2[u]--)Q2[u].push(dis[u]-INF);
	for(int i=fir[u];i;i=nxt[i])if(to[i]!=fa)
	{
		dis[to[i]]=dis[u]+len[i],dfs(to[i],u);
		merge(u,to[i]);
	}
	while(!Q1[u].empty()&&!Q2[u].empty()&&Q1[u].top()+Q2[u].top()-2*dis[u]<0)
	{
		long long x=Q1[u].top(),y=Q2[u].top();
		ans+=x+y-2*dis[u],Q1[u].pop(),Q2[u].pop();
		Q1[u].push(2*dis[u]-y),Q2[u].push(2*dis[u]-x);
	}
}

int main()
{
	n=getint();
	for(int i=1;i<n;i++)
	{
		int u=getint(),v=getint(),w=getint();
		newnode(u,v,w),newnode(v,u,w);
	}
	for(int i=1;i<=n;i++)
	{
		A1[i]=getint(),A2[i]=getint();
		int tmp=min(A1[i],A2[i]);
		A1[i]-=tmp,A2[i]-=tmp,m+=A2[i];
	}
	dfs(1,0);
	printf("%lld\n",ans+INF*m);
}

posted @ 2020-06-26 15:08  Izayoi_Doyo  阅读(205)  评论(0编辑  收藏  举报