社区讨论
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 条回复,欢迎继续交流。
正在加载回复...