P1955 [NOI2015] 程序自动分析
[NOI2015] 程序自动分析
题目描述
在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。
考虑一个约束满足问题的简化版本:假设
现在给出一些约束满足问题,请分别对它们进行判定。
输入格式
输入的第一行包含一个正整数
对于每个问题,包含若干行:
第一行包含一个正整数
输出格式
输出包括
输出文件的第 YES
或者 NO
(字母全部大写),YES
表示输入中的第 NO
表示不可被满足。
样例 #1
样例输入 #1
2
2
1 2 1
1 2 0
2
1 2 1
2 1 1
样例输出 #1
NO
YES
样例 #2
样例输入 #2
2
3
1 2 1
2 3 1
3 1 1
4
1 2 1
2 3 1
3 4 1
1 4 0
样例输出 #2
YES
NO
提示
【样例解释1】
在第一个问题中,约束条件为:
在第二个问题中,约束条件为:
【样例说明2】
在第一个问题中,约束条件有三个:
在第二个问题中,约束条件有四个:
【数据范围】
注:实际上
Solution
看到题目,可以将等于的条件看作边,那么所有的等于条件就是将一些点连在一起形成许多连通块。并且可以知道在等于条件连边的情况下是不可能出现与之前条件矛盾的情况,那么就可以将所有的等于条件提前至所有不等于条件之前来进行处理。
现在来看不等号的条件怎么处理,首先可以得出不等号的条件不会影响之后的任何不等号。因此将不等号当作不对条件产生影响的询问进行处理。因为我们将等于条件提前了,并且利用这些条件建了一个不一定全部联通的图,那么不等于条件就可以转化为询问不等号两边的数在图上是否是联通的。这样就将原题转化为了一个给出图判定连通性的问题。对于判定图的连通性的问题直接用带路径压缩的并查集就可以了。
另外需要注意到题目中
这样这道
#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
template<typename T> void read(T &k)
{
k=0;T flag=1;char b=getchar();
while (!isdigit(b)) {flag=(b=='-')?-1:1;b=getchar();}
while (isdigit(b)) {k=k*10+b-48;b=getchar();}
k*=flag;
}
const int _SIZE=1e6;
int T,n;
int fa[_SIZE+5],order[(_SIZE<<1)+5];
struct EQUAL{
int x,y,e;
bool operator<(const EQUAL &a)const{
return e>a.e;
}
}a[_SIZE+5];
void init()
{
mem(fa,0);mem(order,0);
}
int find(int x)
{
if (x!=fa[x]) return fa[x]=find(fa[x]);
return x;
}
int main()
{
read(T);
while (T--)
{
read(n);
for (int i=1;i<=n;i++)
{
read(a[i].x);read(a[i].y);
read(a[i].e);
order[(i<<1)-1]=a[i].x,order[(i<<1)]=a[i].y;
}
sort(order+1,order+(n<<1)+1);
int tot=unique(order+1,order+(n<<1)+1)-order-1;
for (int i=1;i<=n;i++)
{
a[i].x=lower_bound(order+1,order+tot+1,a[i].x)-order;
a[i].y=lower_bound(order+1,order+tot+1,a[i].y)-order;
//printf("%d %d\n",a[i].x,a[i].y);
}
sort(a+1,a+n+1);
for (int i=1;i<=tot;i++) fa[i]=i;
bool flag=0;
for (int i=1;i<=n;i++)
{
int f1=find(a[i].x);
int f2=find(a[i].y);
if (a[i].e) fa[f1]=f2;
else if (f1==f2) {flag=1;break;}
//printf("%d %d\n",f1,f2);
}
if (flag) printf("NO\n");
else printf("YES\n");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步