那啥那啥 原本今天还是做(看)差分约束的,但是上不去Vjudge我只能来刷并查集了。

%%%静萱大佬把那么多年的noip题都刷遍了,我只能刷水题,noip的题实在是太难了不会啊。

第一道:洛谷P2024食物链

 
虽然说我很不喜欢看别人代码,但是我认为这道题看代码最容易懂:

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=5e4+10;
int n,m,ans,fa[3*maxn]; int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
} int find(int x) {
return fa[x]==x? x:fa[x]=find(fa[x]);
} int main() {
n=read();m=read();
for(int i=1;i<=3*n;++i) fa[i]=i;
int op,x,y,xx,yy;
for(int i=1;i<=m;++i) {
op=read();x=read();y=read();
if(x>n||y>n) {
ans++; continue;
}
if(op==1) {
if(find(x+n)==find(y)||find(x+2*n)==find(y)) {
ans++; continue;
}
xx=find(x);yy=find(y);
if(xx!=yy) fa[xx]=yy;
xx=find(x+n);yy=find(y+n);
if(xx!=yy) fa[xx]=yy;
xx=find(x+2*n);yy=find(y+2*n);
if(xx!=yy) fa[xx]=yy;
}
if(op==2) {
if(find(x)==find(y)||find(x+2*n)==find(y)) {
ans++; continue;
}
xx=find(x+n);yy=find(y);
if(xx!=yy) fa[xx]=yy;
xx=find(y+n*2);yy=find(x);
if(xx!=yy) fa[xx]=yy;
xx=find(x+n*2);yy=find(y+n);
if(xx!=yy) fa[xx]=yy;
}
}
printf("%d",ans);
return 0;
}
/*
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
*/

  

第二道:洛谷P3295萌萌哒

 
竟然用st表套并查集,感觉还是对st表不够了解啊。然后最后的时候像线段树一样下放。。。父子关系?
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
const int maxn=2e5+10;
const ll mod=1e9+7;
int n,m,ql,qr,fl,fr,sz,ans; int fa[maxn][25];
bool ok[maxn]; int aa; char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
} int find(int x,int y) {
return fa[x][y]==x? x : fa[x][y]=find(fa[x][y],y);
} ll qp(ll x,ll k) {
ll rs=1;
while(k) {
if(k&1) (rs*=x)%=mod;
k>>=1; x=x*x%mod;
}
return rs;
} int main() {
n=read();m=read(); int c,t,xx,yy;
for(int i=1;i<=n;++i) for(int j=0;(1<<j)<=n;++j) fa[i][j]=i;
for(int i=1;i<=m;++i) {
ql=read();qr=read();
fl=read();fr=read();
if(ql==fl) continue;
c=qr-ql+1; for(t=0;(1<<t)<=c;++t) ; t--; sz=max(sz,t);
xx=find(ql,t); yy=find(fl,t);
if(xx!=yy) fa[xx][t]=yy;
xx=find(qr-(1<<t)+1,t); yy=find(fr-(1<<t)+1,t);
if(xx!=yy) fa[xx][t]=yy;
}
for(int j=sz;j;--j) for(int i=1;i<=n;++i) {
xx=find(i,j-1);yy=find(find(fa[i][j],j),j-1);
if(xx!=yy) fa[xx][j-1]=yy;
xx=find(i+(1<<j-1),j-1);yy=find(find(fa[i][j],j)+(1<<j-1),j-1);
if(xx!=yy&&yy<=n) fa[xx][j-1]=yy;
}
for(int i=1;i<=n;++i) if(!ok[xx=find(i,0)]) {
ans++; ok[xx]=1;
}
printf("%lld",qp(10,ans-1)*9%mod);
return 0;
}
/*
10 7
2 4 6 8
1 3 7 9
2 2 3 3
1 1 1 1
1 7 2 8
6 7 8 9
1 9 2 10
*/

  

第三道:洛谷P1955程序自动分析

 
这种题就是应该乱搞!
先处理=的情况,然后判不等于是否成立就可以了。
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<set>
using namespace std;
const int maxn=2e5+10;
int T,n,d[maxn],tot=0,fa[maxn];
bool ok;
set<int> G;
set<int>::iterator it; int aa; char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
} struct Node{
int x,y,e;
}node[maxn]; bool cmp(const Node& a,const Node& b) {
return a.e>b.e;
} int find(int x) {
return x==fa[x]? x:fa[x]=find(fa[x]);
} int ef(int x) {
int l=0,r=tot,mid;
while(l<r-1) {
mid=(l+r)>>1;
if(d[mid]==x) return mid;
if(d[mid]<x) l=mid;
else r=mid-1;
}
return r;
} int main() {
T=read();
while(T--) {
n=read(); G.clear(); tot=0;
int x,y,p,xx,yy; ok=0;
for(int i=1;i<=n;++i) {
node[i].x=read();
node[i].y=read();
node[i].e=read();
G.insert(node[i].x);
G.insert(node[i].y);
}
sort(node+1,node+n+1,cmp);
for(it=G.begin();it!=G.end();++it) d[++tot]=*it;
for(int i=1;i<=tot;++i) fa[i]=i;
for(int i=1;i<=n;++i) {
x=ef(node[i].x); y=ef(node[i].y); p=node[i].e;
xx=find(x);yy=find(y);
if(p&&xx!=yy) fa[xx]=yy;
if(!p&&xx==yy) ok=1;
}
if(ok) printf("NO\n");
else printf("YES\n");
}
return 0;
}

  

第四道:P1196银河英雄传说

这个就是并查集是有向的不能乱搞。然后维护一个$x$到$fa[x]$的距离$len$和对于每一个代表员所管辖的节点个数$end$。在find的时候也要更新一下。

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=30000+10;
int n,len[maxn],end[maxn],fa[maxn]; int aa; char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
} int find(int x) {
if(x==fa[x]) return x;
int y=fa[x];
fa[x]=find(fa[x]);
len[x]+=len[y];
return fa[x];
} int main() {
n=read(); char c; int x,y,xx,yy;
for(int i=1;i<=30000;++i)len[i]=0,end[i]=1,fa[i]=i;
for(int i=1;i<=n;++i) {
do c=getchar();while(c!='M'&&c!='C');
x=read();y=read();
xx=find(x);yy=find(y);
if(c=='M') {
fa[xx]=yy; len[xx]+=end[yy]; end[yy]+=end[xx];
}
else {
if(xx==yy) printf("%d\n",abs(len[x]-len[y])-1);
else printf("-1\n");
}
}
return 0;
}

  

第五道:洛谷P1195口袋的天空

 
像最小生成树一样搞。
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1000+10,maxm=10000+10;
int n,m,k,fa[maxn],now,ans; int aa; char cc;
int read() {
aa=0;cc=getchar();
while(cc<'0'||cc>'9') cc=getchar();
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa;
} struct Edge{
int x,y,l;
}edge[maxm]; bool cmp(const Edge& a,const Edge& b) {
return a.l<b.l;
} int find(int x) {
return fa[x]==x? x:fa[x]=find(fa[x]);
} int main() {
n=read();m=read(); k=read(); now=n;
for(int i=1;i<=n;++i) fa[i]=i;
for(int i=1;i<=m;++i) {
edge[i].x=read();
edge[i].y=read();
edge[i].l=read();
}
sort(edge+1,edge+m+1,cmp);
int xx,yy;
for(int i=1;i<=m&&now>k;++i) {
xx=find(edge[i].x);yy=find(edge[i].y);
if(xx!=yy) {
fa[xx]=yy; ans+=edge[i].l; now--;
}
}
if(now!=k) printf("No Answer");
else printf("%d",ans);
return 0;
}

  

几道莫名AC的并查集题的更多相关文章

  1. UOJ_14_【UER #1】DZY Loves Graph_并查集

    UOJ_14_[UER #1]DZY Loves Graph_并查集 题面:http://uoj.ac/problem/14 考虑只有前两个操作怎么做. 每次删除一定是从后往前删,并且被删的边如果不是 ...

  2. BZOJ 4195: [Noi2015]程序自动分析 并查集+离散化

    LUOGU 1955BZOJ 4195 题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量 ...

  3. luoguP3367 [模板]并查集

    题目链接:https://www.luogu.org/problemnew/show/P3367 思路: 今天学了新算法——并查集,本题是简单的并查集题的模板. 核心思想是“递归+压缩路径”. 并查集 ...

  4. 洛谷P3457 [POI2007]POW-The Flood [并查集,模拟]

    题目传送门 pow 题意翻译 Description 你手头有一张该市的地图.这张地图是边长为 m∗n 的矩形,被划分为m∗n个1∗1的小正方形.对于每个小正方形,地图上已经标注了它的海拔高度以及它是 ...

  5. POJ1308/HDU1325/NYOJ129-Is It A Tree?,并查集!

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28838   Accepted: 9843 -& ...

  6. [BZOJ 4025]二分图(线段树分治+带边权并查集)

    [BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...

  7. [hihoCoder]无间道之并查集

    题目大意: #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息……额,说远了,总之, ...

  8. hiho #1066 : 无间道之并查集

    #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息……额,说远了,总之,小Hi和小H ...

  9. hihocoder 1066 无间道之并查集

    #1066 : 无间道之并查集 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 这天天气晴朗.阳光明媚.鸟语花香,空气中弥漫着春天的气息……额,说远了,总之,小Hi和小H ...

随机推荐

  1. Creating a bootable Ubuntu USB stick

    Windows: https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-windows#0 Ubuntu: http ...

  2. 利用TensorFlow识别手写的数字---基于Softmax回归

    1 MNIST数据集 MNIST数据集主要由一些手写数字的图片和相应的标签组成,图片一共有10类,分别对应从0-9,共10个阿拉伯数字.原始的MNIST数据库一共包含下面4个文件,见下表. 训练图像一 ...

  3. Simple implementation and results of genetic algorithm.

    This experiment was done for the final assignment of my Professional English class. This part has be ...

  4. spring入门案例分析及原理

    Springmvc执行原理: 一. 入门案例的执行流程 1. 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载s ...

  5. Luogu P2292 [HNOI2004]L语言(Trie+dp)

    P2292 [HNOI2004]L语言 题面 题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章 \(T\) 是由若干小写字母构成. ...

  6. LUOGU P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

    题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better k ...

  7. JavaScript数据存储和深浅拷贝实际运用

    JavaScript分两种数据类型.1.简单数据类型有:number, string, boolean, undefined和null当声明一个简单数据类型的变量时,在内存中会把数据存在栈里.2.复杂 ...

  8. 访问树中的所有元素(DOM)

    创建一个函数,给定页面上的DOM元素,将访问元素本身及其所有后代(而不仅仅是它的直接子代).对于访问的每个元素,函数应将该元素传递给提供的回调函数. 函数的参数应该是: 一个DOM元素 一个回调函数( ...

  9. 20190814-A Second

    一秒,或是,第二次? 这考试也太频繁了吧…… 考试过程: 看三道题. T1没思路. 然后去厕所清醒了一下. 在厕所的时候,突然想到可以离散化. 于是就这么搞了. 然后去写T2. T2好像是数学题. 于 ...

  10. 20190716-T1-礼物

    呵呵,我暴力WA了 这个题充分考验了大家对数学的理解(麦蒙大多在胡诌) 但是确实如此啊. 看数据范围想状压.(我额嗯嗯想到暴力?) 然后设出一个可爱的$dp$式(主语当然不是我,是出题人大佬) $f_ ...