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;
}

浙公网安备 33010602011771号