1WA于句末标点,ipad手打伤口不起
2Y
并查集
手写离散化
学会了vector的erase+unique的用法
#include<stdio.h>
#include<vector>
#include<algorithm>
#define N 10000+10
using namespace std;
int ft[N];
int find(int x){ return (ft[x]==x) ? x : ft[x]=find(ft[x]); }
void merge(int a,int b){
int ra=find(a),rb=find(b);
ft[ra]=rb;
}
void ini(int n){ while(n--)ft[n]=n; }
vector<int>S;
int l[N],r[N];
int tsf(int x){
int l=0,r=S.size()-1;
while(r-l){
int mid=(l+r)/2;
if(S[l]==x)return l;
if(S[r]==x)return r;
if(S[mid]==x)return mid;
else if(S[mid]>x)r=mid;
else l=mid;
}
}
int main(){
int jump=1,T=0;
while(1){
int p,q;S.clear();
int i=0;
while(scanf("%d%d",&p,&q)!=EOF){
if(p<0&&q<0){jump=0;break;}
if(!p&&!q)break;
S.push_back(p);S.push_back(q);
i++;
l[i]=p;r[i]=q;
}
int n=i;
if(!jump)break;
sort(S.begin(),S.end());
S.erase(unique(S.begin(),S.end()),S.end());
// for(int i=0;i<S.size();i++)printf("%d ",S[i]);printf("\n");
int m=S.size();
ini(m);
int flag=1;
for(i=1;i<=n;i++){
int x,y;
x=tsf(l[i]);y=tsf(r[i]);
if(find(x)==find(y))flag=0;
/* if(find(x)!=x){
if(find(y)!=y)flag=0;
else merge(y,x);
} */
else merge(x,y);
// if(!flag)printf("tsf(%d)=%d tsf(%d)=%d\n",l[i],x,r[i],y);
// for(int i=0;i<m;i++)printf("%d ",find(i));printf("\n");
}
if(m>0){
int root=find(0);
for(i=1;i<m;i++)if(find(i)!=root)flag=0;
}
printf("Case %d ",++T);
if(flag)printf("is");
else printf("is not");
printf(" a tree.\n");
}
return 0;}
本文介绍了一个使用并查集与离散化解决区间覆盖问题的实际案例,通过C++实现并展示了如何利用vector的erase和unique方法进行数据处理。文章详细解释了程序的工作原理,包括输入处理、区间离散化、并查集初始化及合并操作。
3683

被折叠的 条评论
为什么被折叠?



