提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
洛谷的一道离散化的题目,使用map解决。水一篇题解。
一、题目链接
二、代码以及注释
代码如下(示例):
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using PII=pair<ll,ll>;
const ll N = 1e7;
ll n,m,s;
unordered_map<ll,ll>M,Mo;//集合,对立集合
vector<ll>a;
struct p{
ll le,ri,co;
}point[N];
ll find(ll x){
if(M[x]!=x)
M[x]=find(M[x]);
return M[x];
}
bool cmp(p x,p y){//先把相等的划分好集合
return x.co>y.co;
}
void clear(){
M.clear();
Mo.clear();
a.clear();
}
void input(){
cin>>n;
for(ll i=1;i<=n;i++){
cin >> point[i].le >> point[i].ri >> point[i].co;
a.emplace_back(point[i].le);
a.emplace_back(point[i].ri);
}
sort(point+1,point+1+n,cmp);
}
void init_map(){
for(auto i:a)
{
M[i] = i;
Mo[i]=0;
}
}
void slove(){
clear();//清除map
input();//读入数据
init_map();//用map来离散化
//核心代码
for(ll i=1;i<=n;i++){
ll x=find(M[point[i].le]);//le所在集合
ll y=find(M[point[i].ri]);//ri所在集合
ll anginstx=0,anginsty=0;
if(Mo[x])//如果x有对立集合
anginstx=find(Mo[x]);//找到这个集合的头,y同理
if(Mo[y])
anginsty=find(Mo[x]);
if(point[i].co==1){//两个数相等
if(anginstx==y||anginsty==x){//矛盾
cout<<"NO\n";
return;
}
M[x]=y;//合并两个集合
}else{//不相等的情况
if(x==y){//但是在同一个集合
cout<<"NO\n";
return;
}
Mo[x]=y;
Mo[y]=x;
}
}
cout<<"YES\n";
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
ll T=1;
cin>>T;
while(T--)slove();
}
。