社区讨论

TLE on 12,求助

CF1814F Communication Towers参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lze5v6le
此快照首次捕获于
2024/08/03 21:20
2 年前
此快照最后确认于
2024/08/03 22:17
2 年前
查看原帖
CPP
#include<iostream>
#include<vector>
#define int long long
using namespace std;
const int Max=2e5+1;
struct Tree{
	vector<pair<int,int>> edge;
}T[4*Max];
int tag[Max],sz[Max];
int fa[Max],top;
pair<int,int> stk[Max],vertex[Max];
int get(int x){
	if(x==fa[x]){
		return x;
	}
	return get(fa[x]);
}
void merge(int x,int y){
	int X=get(x),Y=get(y);
	if(X==Y){
		return;
	}
	if(sz[X]<sz[Y]){
		swap(X,Y);
	} 
	fa[Y]=X;sz[Y]+=sz[X];
	stk[++top]=make_pair(X,Y);
	tag[Y]-=tag[X];
}
void split(){
	pair<int,int> tmp=stk[top];
	top--;
	int X=tmp.first,Y=tmp.second;
	tag[Y]+=tag[X];
	sz[X]-=sz[Y];
	fa[Y]=Y;		
}
void insert(int p,int l,int r,int L,int R,pair<int,int> val){
	//if(p)cout<<p<<" "<<l<<" "<<r<<endl;
	if(L<=l&&r<=R){
		T[p].edge.push_back(val);
		return; 
	}
	int mid=(l+r)>>1;
	if(L<=mid){
		insert(2*p,l,mid,L,R,val);
	}
	if(R>mid){
		insert(2*p+1,mid+1,r,L,R,val);
	}
}
void solve(int p,int l,int r){
	int mid=(l+r)>>1;
	int pre=top;
	for(auto it:T[p].edge){
		int x=it.first,y=it.second;
		merge(x,y);
	}
	if(l==r){
		tag[get(1)]+=1;
	}else{
		solve(2*p,l,mid);
		solve(2*p+1,mid+1,r);
	}
	while(top>pre){
		split();
	}
}
signed main(){
	ios::sync_with_stdio(0);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>vertex[i].first>>vertex[i].second;
		sz[i]=1;
		fa[i]=i;
	}
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		pair<int,int> val=make_pair(max(vertex[x].first,vertex[y].first),min(vertex[x].second,vertex[y].second));
		if(val.first>val.second){
			continue;
		}
		insert(1,1,200000,val.first,val.second,make_pair(x,y));
	}
	solve(1,1,200000);
	for(int i=1;i<=n;i++){
		if(tag[i]){
			cout<<i<<" ";
		}
	}
//	cout<<ans;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...