• [bzoj2001][Hnoi2010][City 城市建设] (cdq分治)


    Description

    PS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁。Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费。Louis希望建造最少的道路使得国内所有的城市连通。但是由于某些因素,城市之间修建道路需要的花费会随着时间而改变,Louis会不断得到某道路的修建代价改变的消息,他希望每得到一条消息后能立即知道使城市连通的最小花费总和, Louis决定求助于你来完成这个任务。

    Input

    文件第一行包含三个整数N,M,Q,分别表示城市的数目,可以修建的道路个数,及收到的消息个数。 接下来M行,第i+1行有三个用空格隔开的整数Xi,Yi,Zi(1≤Xi,Yi≤n, 0≤Zi≤50000000),表示在城市Xi与城市Yi之间修建道路的代价为Zi。接下来Q行,每行包含两个数k,d,表示输入的第k个道路的修建代价修改为d(即将Zk修改为d)。

    Output

    输出包含Q行,第i行输出得知前i条消息后使城市连通的最小花费总和。

    Sample Input

    5 5 3
    1 2 1
    2 3 2
    3 4 3
    4 5 4
    5 1 5
    1 6
    1 1
    5 3

    Sample Output

    14
    10
    9

    HINT 

    【数据规模】 对于20%的数据, n≤1000,m≤6000,Q≤6000。 有20%的数据,n≤1000,m≤50000,Q≤8000,修改后的代价不会比之前的代价低。 对于100%的数据, n≤20000,m≤50000,Q≤50000。

    Solution

    考虑按时间分治

    显然终止态为分治到一个时间点时,直接修改,并计算出最小生成树,得出答案

    每次操作前,都进行两个操作

    construction,缩必须边

    reduction,删除无用边

    #include <stdio.h>
    #include <algorithm>
    #define RG register
    #define gg 0x7fffffff
    #define N 20010
    #define L 50010
    int n,m,_q,a[L],sum[25],c[L],f[N],sz[N];
    long long ans[N];
    struct edg{
    	int x,y,z,id;
    }e[25][L],d[L],t[L];
    struct que{
    	int x,y;
    }q[L];
    bool cmp(edg u,edg v){
    	return u.z<v.z;
    }
    int getp(RG int x){return f[x]==x?x:f[x]=getp(f[x]);}
    inline void mrg(RG int x,RG int y){
    	if(sz[x]<=sz[y])sz[y]+=sz[x],f[x]=y;
    	else sz[x]+=sz[y],f[y]=x;
    }
    inline void clr(RG int tot){
    	for(RG int i=1;i<=tot;i++){
    		f[d[i].x]=d[i].x;
    		f[d[i].y]=d[i].y;
    		sz[d[i].x]=sz[d[i].y]=1;
    	}
    }
    void con(RG int &tot,RG long long &cnt){
    	RG int O=0;
    	clr(tot);
    	std::sort(d+1,d+1+tot,cmp);
    	for(RG int i=1,x,y;i<=tot;i++){
    		x=getp(d[i].x),y=getp(d[i].y);
    		if(x!=y)mrg(x,y),t[++O]=d[i];
    	}
    	for(RG int i=1;i<=O;i++){
    		f[t[i].x]=t[i].x;
    		f[t[i].y]=t[i].y;
    		sz[t[i].x]=sz[t[i].y]=1;
    	}
    	for(RG int i=1,x,y;i<=O;i++){
    		x=getp(t[i].x),y=getp(t[i].y);
    		if(t[i].z!=-gg&&x!=y)
    			mrg(x,y),cnt+=t[i].z;
    	}
    	O=0;
    	for(RG int i=1;i<=tot;i++)
    		if(getp(d[i].x)!=getp(d[i].y)){
    			t[++O]=d[i];
    			c[d[i].id]=O;
    			t[O].x=f[d[i].x];
    			t[O].y=f[d[i].y];
    		}
    	tot=O;
    	for(RG int i=1;i<=tot;i++)
    		d[i]=t[i];
    }
    void red(RG int &tot){
    	RG int O=0;
    	clr(tot);
    	std::sort(d+1,d+1+tot,cmp);
    	for(RG int i=1,x,y;i<=tot;i++){
    		x=getp(d[i].x),y=getp(d[i].y);
    		if(x!=y)mrg(x,y),t[++O]=d[i],c[d[i].id]=O;
    		else if(d[i].z==gg)t[++O]=d[i],c[d[i].id]=O;
    	}
    	tot=O;
    	for(RG int i=1;i<=tot;i++)
    		d[i]=t[i];
    }
    void cdq(RG int l,RG int r,RG int cur,RG long long cnt){
    	RG int tot=sum[cur];
    	if(l==r)a[q[l].x]=q[l].y;
    	for(RG int i=1;i<=tot;i++)
    		e[cur][i].z=a[e[cur][i].id];
    	for(RG int i=1;i<=tot;i++)
    		d[i]=e[cur][i],c[d[i].id]=i;
    	if(l==r){
    		ans[l]=cnt;
    		clr(tot);
    		std::sort(d+1,d+1+tot,cmp);
    		for(RG int i=1,x,y;i<=tot;i++){
    			x=getp(d[i].x),y=getp(d[i].y);
    			if(x!=y)mrg(x,y),ans[l]+=d[i].z;
    		}
    		return;
    	}
    	for(RG int i=l;i<=r;i++)
    		d[c[q[i].x]].z=-gg;
    	con(tot,cnt);
    	for(RG int i=l;i<=r;i++)
    		d[c[q[i].x]].z=gg;
    	red(tot);
    	for(RG int i=1;i<=tot;i++)
    		e[cur+1][i]=d[i];
    	sum[cur+1]=tot;
    	RG int mid=l+r>>1;
    	cdq(l,mid,cur+1,cnt);cdq(mid+1,r,cur+1,cnt);
    }
    int main(){
    	scanf("%d%d%d",&n,&m,&_q);
    	for(RG int i=1;i<=m;i++){
    		scanf("%d%d%d",&e[0][i].x,&e[0][i].y,&e[0][i].z);
    		a[i]=e[0][i].z;
    		e[0][i].id=i;
    	}
    	for(RG int i=1;i<=_q;i++)
    		scanf("%d%d",&q[i].x,&q[i].y);
    	sum[0]=m;
    	cdq(1,_q,0,0);
    	for(RG int i=1;i<=_q;i++)
    		printf("%lld
    ",ans[i]);
    	return 0;
    }
    

    不知道为什么

    好想自杀啊

  • 相关阅读:
    [NOIP2015] D1T2 信息传递
    Codeforces #447 Div.2 Tutorial
    python进阶
    Vue入门
    python基础
    python介绍
    React笔记_(3)_react语法2
    React笔记_(2)_react语法1
    React笔记_(1)_react概述
    webpack笔记_(3)_First_Project
  • 原文地址:https://www.cnblogs.com/keshuqi/p/6414230.html
Copyright © 2020-2023  润新知