树剖求助
查看原帖
树剖求助
160839
Prean楼主2021/10/13 14:32

RT,树剖+st表,求助为啥WA80pts

#include<algorithm>
#include<cstdio>
#include<cassert>
typedef unsigned ui;
const int M=1e5+5;
struct Edge{
	ui to,val,nx;
}e[M<<1];
unsigned long long V,sum,ans=-1;
struct edge{
	ui u,v,val;bool vis;
	inline bool operator<(const edge&E)const{
		return val<E.val;
	}
}E[M*3];
inline int max(const int&a,const int&b){
	return a>b?a:b;
}
ui n,m,cnt,h[M],lg[M],val[M];
ui dfc,f[M],d[M],dfn[M],top[M],siz[M],son[M];
struct data{
	ui mx,cmx;
	data(const ui&mx=0,const ui&cmx=0):mx(mx),cmx(cmx){}
	inline data operator+(const data&it)const{
		if(mx==it.mx)return data(mx,max(cmx,it.cmx));
		return mx>it.mx?data(mx,max(it.mx,cmx)):data(it.mx,max(mx,it.cmx));
	}
}S[M],st[20][M];
struct DSU{
	ui f[M],siz[M];
	ui Find(const ui&u){
		return f[u]==u?u:f[u]=Find(f[u]);
	}
	inline ui Link(ui u,ui v){
		if((u=Find(u))==(v=Find(v)))return false;
		return(siz[u]>siz[v]?siz[f[v]=u]+=siz[v]:siz[f[u]=v]+=siz[u]),true;
	}
}Tree;
inline void MST(){
	ui i,u,v,C(1);std::sort(E+1,E+m+1);
	for(i=1;i<=n;++i)Tree.siz[Tree.f[i]=i]=1;
	for(i=1;i<=m;++i){
		if(Tree.Link(u=E[i].u,v=E[i].v)){
			e[++cnt]=(Edge){v,E[i].val,h[u]};h[u]=cnt;
			e[++cnt]=(Edge){u,E[i].val,h[v]};h[v]=cnt;
			sum+=E[i].val;E[i].vis=true;if(++C==n)return;
		}
	}
}
void DFS1(const ui&u){
	d[u]=d[f[u]]+1;siz[u]=1;
	for(ui v,E=h[u];E;E=e[E].nx){
		if((v=e[E].to)==f[u])continue;S[v]=e[E].val;f[v]=u;DFS1(v);
		siz[u]+=siz[v];if(siz[v]>siz[son[u]])son[u]=v;
	}
}
void DFS2(const ui&u,const ui&tp){
	top[u]=tp;st[0][dfn[u]=++dfc]=S[u];if(u^tp)S[u]=S[u]+S[f[u]];if(!son[u])return;DFS2(son[u],tp);
	for(ui E=h[u];E;E=e[E].nx)if(e[E].to^f[u]&&e[E].to^son[u])DFS2(e[E].to,e[E].to);
}
inline data Query(ui u,ui v){
	data ans;ui k;
	while(top[u]^top[v])d[top[u]]>d[top[v]]?(ans=ans+S[u],u=f[top[u]]):(ans=ans+S[v],v=f[top[v]]);
	return u^v?((u=dfn[u])>(v=dfn[v])?u^=v^=u^=v:0),k=lg[v-++u+1],ans+st[k][u+(1<<k)-1]+st[k][v]:0;
}
signed main(){
	ui i,j;data mx;scanf("%u%u",&n,&m);lg[0]=-1;
	for(i=1;i<=n;++i)lg[i]=lg[i>>1]+1;
	for(i=1;i<=m;++i)scanf("%u%u%u",&E[i].u,&E[i].v,&E[i].val);MST();DFS1(1);DFS2(1,1);
	for(j=1;(1<<j)<=n;++j){
		for(i=1<<j;i<=n;++i)st[j][i]=st[j-1][i]+st[j-1][i-(1<<j-1)];
	}
	for(i=1;i<=m;++i){
		if(E[i].vis)continue;mx=Query(E[i].u,E[i].v);
		mx.mx==E[i].val?(V=sum+E[i].val-mx.cmx)<ans?ans=V:0:(V=sum+E[i].val-mx.mx)<ans?ans=V:0;
	}
	printf("%llu",ans);
}
2021/10/13 14:32
加载中...