ybtoj:并查集

A:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int fa[100086];
int find(int x){
	return fa[x]==x ? x : fa[x]=find(fa[x]);
}  
void mix(int x,int y){
	if(find(y)!=find(x))fa[find(x)]=find(y);
		
}
char ques(int x,int y){
	x=find(x);
	y=find(y);
	//cout<<x<<" "<<y;
	return x==y ? 'Y' : 'N' ;
	
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		fa[i]=i;
		
	}
	for(int i=1;i<=m;i++){
		int a,b,c;
		cin>>a>>b>>c;
		if(a==1){
			mix(b,c);
		}
		if(a==2){
			cout<<ques(b,c)<<endl;
		}
	}
	return 0;
}

B:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e4+5;
int tot[N],fa[N],dis[N];
int T;

inline int find(int x){
	if(fa[x]==x) return x;
	int fath=find(fa[x]);
	dis[x]+=dis[fa[x]];
	return fa[x]=fath;
}

inline void Merge(int x,int y)
{
	int xx=find(x);
	int yy=find(y);
	dis[xx]=tot[yy];
	tot[yy]+=tot[xx];
	fa[xx]=yy;
}
int main(){
	for(int i=1;i<=30000;i++){
		fa[i]=i;
		tot[i]=1;
		
	}
	cin>>T;
	int x,y;
	char ch;
	while(T--){
		while(ch=getchar(),ch !='M' && ch !='C');
		cin>>x>>y;
		if(ch=='M'){
			Merge(x,y);
		}
		else {
			if(find(x)==find(y)){
				printf("%d\n",abs(dis[x]-dis[y])-1);
			}
			else cout<<-1<<endl;
		}
	}
	return 0;
}

C:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,k;
int ans;
short a;
int x,y;
int fa[150005];
inline int find(int x){
	return fa[x]==x ? x : fa[x]=find(fa[x]);
}
inline bool check(int x,int y){
	return find(x)==find(y);
}
inline void merge(int x,int y){
	if(find(x)!=find(y)) fa[find(x)]=find(y);
}

int main()
{
	cin>>n>>k;
	for(int i=1;i<=n*3;i++){
		fa[i]=i;
	}
	
	for(int i=1;i<=k;i++){
		cin>>a>>x>>y;
		if(x>n || y>n){
			ans++;
		}
		else if(a==1){
			if(check(x,y+n) || check(x,y+(n<<1))){
				ans++;
			}
			else{
				merge(x,y);
				merge(x+n,y+n);
				merge(x+(n<<1),y+(n<<1));
				
			}
			
		}
		else if(a==2){
			if(check(x,y) || check(x,y+(n<<1))){
				ans++;
			}
			else{
				merge(x,y+n);
				merge(x+n,y+(n<<1));
				merge(x+(n<<1),y);
				
			}
			
		}
		
	}
	cout<<ans;
	return 0;
}

D:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int n;

struct goods {
    int val;
    int day;
} good[10001];
bool day[10001];
bool cmp(goods a, goods b) {
	if(a.val!=b.val)return a.val > b.val;
	else return a.day>b.day;
}
int main() {
    while (scanf("%d",&n)) {
    	int sum=0;
        for(int i=1;i<=n;i++){
			cin>>good[i].val>>good[i].day;
			
		}
		sort(good+1,good+n+1,cmp);
//		for(int i=1;i<=n;i++){
//			cout<<good[i].val<<" ";
//		}
		memset(day,0,sizeof(day));
		
		for(int i=1;i<=n;i++){
			for(int j=good[i].day;j>=1;j--){
				if(day[j]==0){
					day[j]=1;
					sum+=good[i].val;
					//cout<<sum<<"   ";
					break;
				}
			}
		}
		cout<<sum<<endl;
    }
    return 0;
}

E:

点击查看代码
#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N=1e6+10;
int n,m,k,fa[N],ans;
bool woohoo[N];//君有疾否?

struct edge
{
    int fr,to,val;
    inline void input()
    {
        cin>>fr>>to>>val;
    }
    bool operator<(const edge&wow) const
    {
        return val>wow.val;
    }
}e[N];

int find(int x)
{
    return fa[x]==x ? fa[x] : fa[x]=find(fa[x]);
}

inline bool merge(int x,int y)
{
    x=find(x),y=find(y);
    if(x==y)
    {
        return true;
    }
    if(woohoo[x] && woohoo[y])
    {
        return false;//君有疾!不可医!
    }
    if(woohoo[x]==1)
    {
        fa[y]=x;
        return true;
    }
    fa[x]=y;
    return true;
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>m>>k;
    for(int i=1;i<=k;i++)
    {
        int x;
        cin>>x;
        woohoo[x]=1;
    }

    for(int i=1;i<=m;i++)
    {
        e[i].input();
    }
    sort(e+1,e+m+1);
    for(int i=0;i<n;i++)
    {
        fa[i]=i;
    }
    for(int i=1;i<=m;i++)
    {
        if(!merge(e[i].fr,e[i].to))
        {
            ans+=1ll*e[i].val;
        }
    }
    cout<<ans<<"\n";

    return 0;
}

F:

点击查看代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e4+10;
int fa[N],cnt[N],team[N];
ll res,ans[N];
struct point{
	int x,y,d;
	void input(){
		cin>>x>>y>>d;
	}
	bool operator<(const point&nb)const{
		return d<nb.d;
	}
}box[N*5];

struct node{
	int id,q;
	bool operator<(const node&nb)const{
		return q<nb.q;
	}
}query[N*5];

inline int find(int x){
	if(fa[x]==x) return x;
	cnt[fa[x]]+=cnt[x];
	cnt[x]=0;
	return fa[x]=find(fa[x]);
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--){
		int n,m,q,to=1,res=0;
		cin>>n>>m>>q;
		for(register int i=1;i<=n;i++) cnt[i]=1,fa[i]=i;
		for(register int i=1;i<=m;i++) box[i].input();
		sort(box+1,box+m+1);
		for(register int i=1;i<=q;i++){
			cin>>query[i].q;
			query[i].id=i;
		}
		sort(query+1,query+q+1);
		for(register int i=1;i<=q;i++){
			while(to<=m && box[to].d<=query[i].q){
				int l=find(box[to].x),r=find(box[to].y);
				if(l!=r){
					res+=(ll)cnt[l]*cnt[r]*2;
					fa[l]=r;
					cnt[r]+=cnt[l];cnt[l]=0;
				}
				to++;
			}
			ans[query[i].id]=res;
		}
		for(register int i=1;i<=q;i++) cout<<ans[i]<<"\n";
	}

	return 0;
}

G:

点击查看代码
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;

namespace Cathy {

const int N = 2e6 + 0721;
int fa[N];
int a[N];
int T, n, m, tot;

struct node {
	int i, j, e;
	friend bool operator<(node x, node y) {
		return x.e > y.e;
	}
} ques[N];

inline int read() {
    int xr = 0, F = 1; 
	char cr;
    while (cr = getchar(), cr < '0' || cr > '9') if (cr == '-') F = -1;
    while (cr >= '0' && cr <= '9') 
        xr = (xr << 3) + (xr << 1) + (cr ^ 48), cr = getchar();
    return xr * F;
}

void init() {
	for (int i = 1; i <= (m << 1); ++i) fa[i] = i;
}

int find(int x) {
	return fa[x] == x ? x : fa[x] = find(fa[x]);
}

void discretization() {
	sort(a + 1, a + 1 + tot);
	m = unique(a + 1, a + 1 + tot) - a - 1;
	for (int i = 1; i <= n; ++i) {
		ques[i].i = lower_bound(a + 1, a + 1 + m, ques[i].i) - a;
		ques[i].j = lower_bound(a + 1, a + 1 + m, ques[i].j) - a;
	}
}

void main() {
	T = read();
	while (T--) {
		n = read();
		tot = 0;
		bool flag = 1;
		for (int i = 1; i <= n; ++i) {
			ques[i].i = read(), ques[i].j = read(), ques[i].e = read();
			a[++tot] = ques[i].i;
			a[++tot] = ques[i].j;
		}
		discretization();
		init();
		sort(ques + 1, ques + 1 + n);
		for (int i = 1; i <= n; ++i) {
			int x = ques[i].i, y = ques[i].j;
			int fx = find(x), fy = find(y);
			int fmx = find(x + m), fmy = find(y + m);
			if (ques[i].e) {
				if (fx == fy) continue;
				fa[fx] = fy;
			} else {
				if (fx == fy) {
					flag = 0;
					printf("NO\n");
					break;
				}
			}
		}
		
		if (flag) printf("YES\n");
	}
}

}

int main() {
	Cathy::main();
	return 0;
}

H:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=2e6+10;
int l,r,fa[N];

inline int find(int x)
{
    return x==fa[x] ? fa[x] : fa[x]=find(fa[x]);
}

inline void merge(int x,int y)
{
    fa[find(y)]=find(x);
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>m;
    int ans=n;

    for(int i=1;i<=n+1;i++)
    {
        fa[i]=i;
    }
    for(int i=1;i<=m;i++)
    {
        cin>>l>>r;
        int wow=find(l);
        while(wow<=r)
        {
            merge(wow+1,wow);
            wow=find(wow);

            ans--;
        }
        cout<<ans<<"\n";
    }

    return 0;
}

I:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,m,p;
const int N=1e6+10;
int fa[N],num[N];
#define ll long long

inline int find(int x)
{
    if(x==fa[x])
    {
        return x;
    }
    int tmp=fa[x];
    fa[x]=find(fa[x]);
    num[x]=(num[x]+num[tmp])%p;
    return fa[x];
}

inline void merge(int x,int y,int c)
{
    int l=fa[x],r=fa[y];
    fa[r]=l,num[r]=(num[x]+c-num[y]+p)%p;
    return ;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin>>n>>m>>p;
    for(int i=1;i<=n;i++)
    {
        fa[i]=i;
    }
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        a=a-1;
        int l=find(a),r=find(b);
        if(l!=r)
        {
            merge(a,b,c);
        }
        else
        {
            if((num[a]+c)%p!=(num[b])%p)
            {
                cout<<i-1<<"\n";
                return 0;
            }
        }
    }
    cout<<m<<"\n";
    return 0;
    cout<<"qwq";
}

J:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int m;
#define id(x,y) ((x-1)*100001+y)
bool col[50*100001+10];
int fa[50*100001+10];
int find(int x)
{
	return fa[x]==x ? x : fa[x]=find(fa[x]);
}
int net[51][100002];
int get_net(int x,int y)
{
	return net[x][y]==y ? y : net[x][y]=get_net(x,net[x][y]);
}
const int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};

void access(int x,int y)
{
	int p=id(x,y);
	col[p]=1;
	for(int i=0;i<4;i++)
	{
		int q=id(x+dx[i],y+dy[i]);
		if(q<1 || q>50*100001 || !col[q]) continue;
		fa[find(p)]=find(q);
	}
}

int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin>>m;
	for(int i=1;i<=50*100001;i++)
	{
		fa[i]=i;
	}
	for(int i=1;i<=50;i++)
	{
		for(int j=1;j<=100001;j++)
		{
			net[i][j]=j;
		}
	}
	while(m--)
	{
		int opt,x1,y1,x2,y2;
		cin>>opt>>x1>>y1>>x2>>y2;
		if(opt)
		{
			int p=id(x1,y1),q=id(x2,y2);
			if(col[p]==1 && col[q]==1 && find(p)==find(q))
			{
				cout<<1<<"\n";
			}
			else
			{
				cout<<0<<"\n";
			}
		}
		else
		{
			if(x1>x2)
			{
				swap(x1,x2);
			}
			if(y1>y2)
			{
				swap(y1,y2);
			}
			for(int i=x1;i<=x2;i++)
			{
				int x=get_net(i,y1);
				while(x<=y2)
				{
					access(i,x),x=net[i][x]=get_net(i,x+1);
				}
			}
		}
	}
	return 0;
}
WA了踹我
posted @ 2025-02-18 22:48  cathyzro  阅读(13)  评论(0)    收藏  举报