【JZOJ6376】樱符[完全墨染的樱花]
description

analysis
无向图上任意两点最大流不超过\(2\),说明该图是仙人掌
由于最大流等于最小割,如果一条边在两个环里,断掉两个端点至少需要\(3\)的代价
对于该仙人掌,求两点间的最小割,那么要么割一条桥边,要么割一个环上的两条边
环上边权最小边一定要割,那就把这条边断开,环上其他边边权加上该边边权,相当于提前割
然后图就变成了一棵树,任意两点间最小割即为路径最小值
把\(n-1\)条树边从大到小插入,这样前面的不会影响到后面的贡献
并查集维护每一个集合的\(\sum p^{(i-1)n},\sum p^i\),由于分配律所以两个集合的贡献相乘就是整个集合的贡献
我一开始\(naive\)认为要用\(tarjan\)缩环,打了才发现我还\(too\) \(young\)
\(m\)条边降序排序后先直接构树,记录构成环的边,然后找这些边端点\(LCA\),暴力把路径上的边权加上
注意不要太过暴力,身经百战后倍增也是很重要的
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 300005
#define MAXM 500005
#define ha 998244353
#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)
#define rep(i,a) for (reg i=last[a];i;i=next[i])
using namespace std;
ll last[MAXM*2],next[MAXM*2],tov[MAXM*2],len[MAXM*2];
ll fa[MAXN],falen[MAXN],depth[MAXN];
ll sumin[MAXN],sumi[MAXN],anc[MAXN][20];
ll n,m,p,tot,ans,cnt;
bool bz[MAXN];
struct edge
{
	ll x,y,z;
}a[MAXM],b[MAXM];
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 ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline bool cmp(edge a,edge b){return a.z>b.z;}
inline ll getfa(ll x){return fa[x]==x?x:fa[x]=getfa(fa[x]);}
inline ll pow(ll x,ll y)
{
	ll z=1;
	while (y){if (y&1)z=z*x%ha;x=x*x%ha,y>>=1;}
	return z;
}
inline ll lca(ll x,ll y)
{
	if (depth[x]<depth[y])swap(x,y);
	fd(i,19,0)if (depth[anc[x][i]]>=depth[y])x=anc[x][i];
	if (x==y)return x;
	fd(i,19,0)if (anc[x][i]!=anc[y][i])x=anc[x][i],y=anc[y][i];
	return anc[x][0];
}
inline void link(ll x,ll y,ll z){next[++tot]=last[x],last[x]=tot,tov[tot]=y,len[tot]=z;}
inline void dfs(ll x,ll y)
{
	fo(i,1,19)anc[x][i]=anc[anc[x][i-1]][i-1];
	rep(i,x)if (tov[i]!=y)fa[tov[i]]=anc[tov[i]][0]=x,falen[tov[i]]=len[i],depth[tov[i]]=depth[x]+1,dfs(tov[i],x);
}
int main()
{
	freopen("T2.in","r",stdin);
	//freopen("sakura.in","r",stdin);
	//freopen("sakura.out","w",stdout);
	n=read(),m=read(),p=read();
	fo(i,1,n)fa[i]=i;
	fo(i,1,m)a[i].x=read(),a[i].y=read(),a[i].z=read();
	sort(a+1,a+m+1,cmp);
	fo(i,1,m)
	{
		ll x=a[i].x,y=a[i].y,z=a[i].z,xx=getfa(x),yy=getfa(y);
		if (xx!=yy)fa[xx]=yy,link(x,y,z),link(y,x,z);
		else b[++cnt].x=x,b[cnt].y=y,b[cnt].z=z;
	}
	depth[1]=1,dfs(1,0),tot=0;
	fo(i,1,cnt)
	{
		ll x=b[i].x,y=b[i].y,z=b[i].z,LCA=lca(x,y);
		if (LCA!=x){falen[x]+=z;while (fa[x]!=LCA)x=fa[x],falen[x]+=z;}
		if (LCA!=y){falen[y]+=z;while (fa[y]!=LCA)y=fa[y],falen[y]+=z;}
	}
	fo(i,2,n)a[++tot].x=i,a[tot].y=fa[i],a[tot].z=falen[i];
	sort(a+1,a+n,cmp);
	fo(i,1,n)sumin[i]=pow(p,(i-1)*n),sumi[i]=pow(p,i),fa[i]=i;
	fo(i,1,n-1)
	{
		ll x=a[i].x,y=a[i].y,z=a[i].z,xx=getfa(x),yy=getfa(y);
		(ans+=(z*sumin[xx]%ha*sumi[yy]%ha+z*sumin[yy]%ha*sumi[xx]%ha)%ha)%=ha;
		fa[xx]=yy,(sumin[yy]+=sumin[xx])%=ha,(sumi[yy]+=sumi[xx])%=ha;
	}
	printf("%lld\n",ans);
	return 0;
}
												
											【JZOJ6376】樱符[完全墨染的樱花]的更多相关文章
- 9 Days 停课修炼题解集
		
xj4604 排序 \(n,k <= 1e5\). 先考虑二分出这个值,check 有多少段的平均值小于这个 mid,这个在之前的复活赛中是原题 T4,数形结合,$ \text{Average} ...
 - 【带权并查集】【HDU3038】【How Many Answers Are Wrong】d s
		
这个题看了2天!!!最后看到这篇题解才有所明悟 转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4298091.html ---by 墨染之樱 ...
 - hdu3038 How Many Answers Are Wrong【基础种类并查集】
		
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4298091.html ---by 墨染之樱花 题目链接:http://acm.hdu.ed ...
 - poj2486 Apple Tree【区间dp】
		
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4374766.html ---by 墨染之樱花 [题目链接]http://poj.org/p ...
 - HYSBZ1588 营业额统计【Splay】
		
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4366582.html ---by 墨染之樱花 [题目链接]http://www.lydsy ...
 - hdu5115 Dire Wolf【区间dp】
		
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4361169.html ---by 墨染之樱花 [题目链接]http://acm.hdu.e ...
 - poj1144 Network【tarjan求割点】
		
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4319585.html ---by 墨染之樱花 [题目链接]http://poj.org/p ...
 - poj1236 Network of Schools【强连通分量(tarjan)缩点】
		
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4316263.html ---by 墨染之樱花 [题目链接]http://poj.org/pr ...
 - poj2342 Anniversary party【树形dp】
		
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4316097.html ---by 墨染之樱花 [题目链接]http://poj.org/p ...
 
随机推荐
- XVIII Open Cup named after E.V. Pankratiev Stage 5: Eastern Grand Prix
			
contest link easy: EI medium-easy: BCDGK medium: L medium-hard: AFH A. Artifacts B. Brackets and Dot ...
 - 【Codeforces】450 B(div2)
			
题目链接:http://codeforces.com/problemset/problem/450/B 题意: 求这个的第n项. 题解:$f_{i+1} = f_i - f_{i-1} $ \begi ...
 - 一键抓取Android的Locat Log
			
很多小伙伴在做App测试时,一遇到Cash,开发同学最常说的一句话,就是抓下Locat日志,很多小伙伴一听到这个抓取日志就会觉得有点烦. 主要有2点:   1.是这个bug可能不好 ...
 - VUE 中 使用 iview Form组件 enter键防止页面刷新
			
<Form :label-width="100" inline label-position='left' @keydown.native.enter.prevent =&q ...
 - 使用Kettle的命名参数动态执行作业
			
关于如何根据传入的不同参数,达到动态运行作业的目的,这里不介绍.只提供一个思路,就是不同的调度进程调度同一个Kettle文件时,传入了不同的参数,从而得到不同的数据. 如下图所示: 1. 先设置参数名 ...
 - Mybatis_环境搭建
			
1.配置pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
 - ZMQ面面观
			
ZMQ是什么? 这是个类似于Socket的一系列接口,他跟Socket的区别是:普通的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的连 ...
 - 使用sqlyog工具同步两个相同结构的数据库之间的数据
			
compare two database data 因为工作上遇到 同一个项目被部署到不同服务器上,原项目(后统称"源")在运行中,后部署的项目(后统称"目标" ...
 - ZF、TP、CI等各种框架的区别
			
(原标题:面试常见问题之ZF.TP.CI等框架的区别 http://blog.163.com/m13341159039_1/blog/static/245953061201522092212820/) ...
 - 【Bootstrap】 框架 栅格布局系统设计原理
			
前提条件(Bootstrap 自带) 首先使用这个布局之前要定义一下代码: 这行代码如果不懂,可以搜索一下,总之大致意思就是,被定义的元素的内边距和边框不再会增加它的宽度,不加入的话排版会有问题. 不 ...