博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【luogu4185】 [USACO18JAN]MooTube [并查集]
阅读量:5133 次
发布时间:2019-06-13

本文共 1165 字,大约阅读时间需要 3 分钟。

 

并查集好合并不好拆开 可以考虑离线 先读入 从大到小排序 再依次合并

技巧:不好断开就倒着来合并 JSOI2008 P1197 也是该思想

#include
using namespace std;#define Max(x,y) (x)<(y)?(y):(x)#define Min(x,y) (x)<(y)?(x):(y)#define ll long long#define rg registerconst int N=300000+5,M=1000000+5,inf=0x3f3f3f3f,P=9999973;int n,m,f[N],sz[N];template
void rd(t &x){ x=0;int w=0;char ch=0; while(!isdigit(ch)) w|=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=w?-x:x;}int find(int x) {
return f[x]==x?x:f[x]=find(f[x]);}void merge(int x,int y){ int fx=find(x),fy=find(y); if(fx==fy) return; sz[fx]+=sz[fy],f[fy]=fx;}struct edge{
int u,v,w;}e[N<<1];struct node{
int k,v,pos,ans;}ask[N];bool cmp1(edge a,edge b){
return a.w>b.w;}bool cmp2(node a,node b){
return a.k>b.k;}bool cmp3(node a,node b){
return a.pos
=ask[i].k) merge(e[nxte].u,e[nxte].v),++nxte; ask[i].ans=sz[find(ask[i].v)]-1; }// for(int i=1;i<=n;++i) printf("%d ",sz[i]); sort(ask+1,ask+m+1,cmp3); for(int i=1;i<=m;++i) printf("%d\n",ask[i].ans); return 0;}

 

转载于:https://www.cnblogs.com/lxyyyy/p/11220678.html

你可能感兴趣的文章
8、RDD持久化
查看>>
第二次团队冲刺--2
查看>>
Linux上架设boost的安装及配置过程
查看>>
[转载]加密算法库Crypto——nodejs中间件系列
查看>>
使用Xshell密钥认证机制远程登录Linux
查看>>
Android 画图之 Matrix(一)
查看>>
【模板】最小生成树
查看>>
设计模式之结构型模式
查看>>
使用pygal_maps_world.i18n中数据画各大洲地图
查看>>
jQuery EasyUI 的下拉选择combobox后台动态赋值
查看>>
timeline时间轴进度“群英荟萃”
查看>>
python if else elif statement
查看>>
网络编程
查看>>
文本隐藏(图片代替文字)
查看>>
java面试题
查看>>
提高码力专题(未完待续)
查看>>
pair的例子
查看>>
前端框架性能对比
查看>>
uva 387 A Puzzling Problem (回溯)
查看>>
12.2日常
查看>>