【JZOJ5433】圖

description

有一個n個點A+B條邊的無向連通圖,有一變量x,每條邊的權值都是一個關於x的簡單多項式,其中有A條邊的權值是k+x,另外B條邊的權值是k-x,如果只保留權值形如k+x的邊,那麼這個圖仍是一個連通圖,如果只保留權值形如k-x的邊,這個圖也依然是一個連通圖。
給出q組詢問,每組詢問給出x的值,問此時這個無向連通圖的最小生成樹權值是多少。


analysis

  • 首先容易知道圖任意時候的MSTMST只由AA集合或BB集合內的邊組成

  • xx-∞逐漸變爲++∞MSTMST會從只由AA的邊構成逐漸變成只由BB的邊構成

  • 這裏MSTMST只會變化n1n-1次,那麼用LCTLCT維護MSTMST的添邊刪邊

  • 當然先kruskalkruskalAABB各有用的n1n-1條邊搞出來,把AA的邊塞到LCTLCT上面

  • 升序排序BB的邊一條條加進LCTLCT裏面,然後代替掉新環裏kk最大的AA

  • 用當前BB邊的kxk-x減去刪去該AA邊的k+xk+x,會得到k2xk'-2x一類式子

  • 注意如果查詢的環邊上有BB邊,因爲只換掉AA邊無視BB邊,所以連BB邊時不用連邊節點

  • 如果有多條BB邊,由於升序加入LCTLCT,所以kk更小的BB邊會貢獻得早

  • 對於最後的求答案,把詢問排序,且已經得到n1n-1k2xk-2x這樣的式子

  • 把式子再按kk排序,看每個詢問會用到前替換的多少條邊(也就是前多少條式子)

  • 掃一遍這堆式子,只要k2k-2*當前詢問的數<=0<=0,說明替換這條邊是有貢獻的,繼續掃下去

  • 注意答案還要算上每個kk以及剩下還沒有被替換的AA邊裏的+x+x


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 500005
#define ha 1926081719491001
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)

using namespace std;

ll tr[MAXN][2],fa[MAXN],pf[MAXN],st[MAXN],fat[MAXN],val[MAXN],answer[MAXN];
ll n,A,B,q,tot,cnt,ans;
struct quiry{ll x,y;}inquiry[MAXN];
struct edge{ll x,y,z;}f[2][MAXN],g[MAXN];
struct node{ll mx,val,size;bool rev;}a[MAXN];
inline ll read(){ll x=0,f=1;char ch=getchar();while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;}
inline void swap(ll &x,ll &y){ll z=x;x=y,y=z;}
inline bool cmp(edge a,edge b){return a.z<b.z;}
inline bool cmpp(quiry a,quiry b){return a.x<b.x;}
inline ll getfa(ll x){return !fat[x]?x:fat[x]=getfa(fat[x]);}
inline void update(ll x){if (!x)return;a[x].mx=x;if (a[a[tr[x][0]].mx].val>a[a[x].mx].val)a[x].mx=a[tr[x][0]].mx;if (a[a[tr[x][1]].mx].val>a[a[x].mx].val)a[x].mx=a[tr[x][1]].mx;a[x].size=a[tr[x][0]].size+a[tr[x][1]].size+1;}
inline void reverse(ll x){if (x)swap(tr[x][0],tr[x][1]),a[x].rev^=1;}
inline void down(ll x){if (a[x].rev)reverse(tr[x][0]),reverse(tr[x][1]),a[x].rev=0;}
inline void downdata(ll x){while (x)st[++st[0]]=x,x=fa[x];while (st[0])down(st[st[0]--]);}
inline ll lr(ll x){return tr[fa[x]][1]==x;}
inline void rotate(ll x){ll y=fa[x],k=lr(x);tr[y][k]=tr[x][!k];if (tr[x][!k])fa[tr[x][!k]]=y;fa[x]=fa[y];if (fa[y])tr[fa[y]][lr(y)]=x;tr[x][!k]=y,fa[y]=x,pf[x]=pf[y],update(y),update(x);}
inline void splay(ll x,ll y){downdata(x);while (fa[x]!=y){if (fa[fa[x]]!=y)rotate(lr(fa[x])==lr(x)?fa[x]:x);rotate(x);}}
inline void access(ll x){for (ll y=0;x;update(x),y=x,x=pf[x])splay(x,0),fa[tr[x][1]]=0,pf[tr[x][1]]=x,tr[x][1]=y,fa[y]=x,pf[y]=0;}
inline void makeroot(ll x){access(x),splay(x,0),reverse(x);}
inline void link(ll x,ll y){makeroot(x),pf[x]=y;}
inline void cut(ll x,ll y){makeroot(x),access(y),splay(x,0),tr[x][1]=fa[y]=pf[y]=0,update(x);}
inline ll query(ll x,ll y){makeroot(x),access(y),splay(y,0);return a[y].mx;}
int main()
{
	//freopen("T3.in","r",stdin);
	freopen("graph.in","r",stdin);
	freopen("graph.out","w",stdout);
	n=read(),A=read(),B=read(),q=read();
	fo(i,1,A)f[0][i].x=read(),f[0][i].y=read(),f[0][i].z=read();
	fo(i,1,B)f[1][i].x=read(),f[1][i].y=read(),f[1][i].z=read();
	sort(f[0]+1,f[0]+A+1,cmp),sort(f[1]+1,f[1]+B+1,cmp);
	fo(i,0,n)a[i].val=-ha;
	fo(i,1,A)
	{
		ll x=f[0][i].x,y=f[0][i].y,z=f[0][i].z;
		if (getfa(x)!=getfa(y))fat[getfa(x)]=getfa(y),ans+=z,
		a[n+i].val=z,a[n+i].mx=n+i,link(x,n+i),link(n+i,y);
	}
	memset(fat,0,sizeof(fat));
	fo(i,1,B)
	{
		ll x=f[1][i].x,y=f[1][i].y,z=f[1][i].z;
		if (getfa(x)!=getfa(y))fat[getfa(x)]=getfa(y),g[++tot]=f[1][i];
	}
	fo(i,1,tot)
	{
		ll x=g[i].x,y=g[i].y,z=g[i].z,tmp=query(x,y);
		if (tmp<=n)continue;
		cut(f[0][tmp-n].x,tmp),cut(tmp,f[0][tmp-n].y);
		link(x,y),val[++cnt]=z-a[tmp].val;
	}
	fo(i,1,q)inquiry[i].x=read(),inquiry[i].y=i;
	sort(inquiry+1,inquiry+q+1,cmpp),sort(val+1,val+cnt+1);
	ll m=1;
	fo(i,1,q)
	{
		while (m<=tot && val[m]<=inquiry[i].x*2)ans=ans+val[m++];
		answer[inquiry[i].y]=ans+inquiry[i].x*(n-(m-1)*2-1);
	}
	fo(i,1,q)printf("%lld\n",answer[i]);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章