博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并查集 || [USACO18JAN]MooTube || BZOJ 5188 || Luogu P4185
阅读量:5242 次
发布时间:2019-06-14

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

题面:

题解:

对边和询问都排序,然后每次把符合当前要求的边都扔并查集里,对于每个询问判断当前并查集里节点数即可。

我很无聊地给并查集加了按秩排序,还开了O2,加了快读,也才170ms,虽然在第一面,然鹅还是没有办法排太前。

上述操作都不做也行

代码:

1 #include
2 #include
3 using namespace std; 4 inline int rd(){ 5 int x=0; char c=getchar(); 6 while(c<'0'||c>'9')c=getchar(); 7 while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();} 8 return x; 9 }10 const int maxn=1e5+5,maxq=1e5+5;11 int N,Q,a,b,c,fa[maxn],dep[maxn],f1,f2,now,cnt[maxn],ans[maxq];12 struct Edge{ int from,to,dis; }edge[maxn];13 struct Query_{ int k,x,id; }qry[maxq];14 inline bool cmp1(const Edge&a,const Edge&b){ return a.dis>b.dis; }15 inline bool cmp2(const Query_&a,const Query_&b){ return a.k>b.k; }16 inline int getf(int a){17 if(fa[a]==a) return a;18 fa[a]=getf(fa[a]);19 return fa[a];20 }21 int main(){22 scanf("%d%d",&N,&Q);23 for(int i=1;i
=qry[i].k){39 now++;40 f1=getf(edge[now].from);41 f2=getf(edge[now].to);42 if(f1!=f2){43 if(dep[f1]
dep[f2]){48 fa[f2]=f1;49 cnt[f1]+=cnt[f2];50 }51 else{52 fa[f1]=f2;53 dep[f2]++;54 cnt[f2]+=cnt[f1];55 }56 }57 }58 ans[qry[i].id]=cnt[getf(qry[i].x)]-1;59 }60 for(int i=1;i<=Q;i++) printf("%d\n",ans[i]);61 return 0;62 }
View Code

 


By:AlenaNuna

 

转载于:https://www.cnblogs.com/AlenaNuna/p/11604583.html

你可能感兴趣的文章
简单的SQL语句
查看>>
linux grep 搜索查找
查看>>
指针实验报告
查看>>
for循环语句
查看>>
python-加密
查看>>
实用小命令汇总(个人使用)
查看>>
Not enough free disk space on disk '/boot'(转载)
查看>>
android 签名
查看>>
堆 栈
查看>>
Kth Smallest Element in Unsorted Array
查看>>
vue项目中使用百度统计
查看>>
第 十一 次作业
查看>>
利用PHP SOAP实现WEB SERVICE[转载]
查看>>
[leetcode DP]120. Triangle
查看>>
数组filter()参数详解,巧用filter()数组去重
查看>>
查询项目中未被使用的js、css和图片
查看>>
Cookie.js
查看>>
Django Blog学习笔记(一)
查看>>
什么是“堆”,"栈","堆栈","队列",它们的区别
查看>>
什么是lambda函数?它有什么好处?
查看>>