在實現程式自動分析的過程中,常常需要判定一些約束條件是否能被同時滿足。
考慮乙個約束滿足問題的簡化版本:假設 x1,x2,x3,… 代表程式**現的變數,給定 n 個形如 xi=xj 或 xi≠xj 的變數相等/不等的約束條件,請判定是否可以分別為每乙個變數賦予恰當的值,使得上述所有約束條件同時被滿足。例如,乙個問題中的約束條件為:x1=x2,x2=x3,x3=x4,x1≠x4,這些約束條件顯然是不可能同時被滿足的,因此這個問題應判定為不可被滿足。
現在給出一些約束滿足問題,請分別對它們進行判定。
1≤n≤1000001≤i,j≤1000000000
題解:考慮用並查集,若xi,xj相同,就用並查集連起來,判斷哪些不同的,如果xi!=xj但是兩者屬於同一集合,就不行。由於i,j很大所以要用到離散化。
#include
using
namespace std;
typedef
long
long ll;
const
int n=
1e6+10;
int cas,n1,n2,n,m;
struct nodea[n][2
];ll b[n]
;int fa[n]
;int
getfa
(int x)
intmain()
else
}sort
(b+1
,b+m+1)
;int h=
unique
(b+1
,b+m+1)
-(b+1)
;for
(int i=
1;i<=h;i++
) fa[i]
=i;for
(int i=
1;i<=n1;i++)}
bool flag=1;
for(
int i=
1;i<=n2;i++)}
if(flag)
printf
("yes\n");
else
printf
("no\n");
}return0;
}
NOI2015 程式自動分析(並查集)
傳送門 開始想錯了,寫了個種類並查集 結果發現可能會有很多個種類 便直接離線做 先把所有相等的mer ge merge merg e在一起 然後再處理不等的 如果有不等關係的在同乙個聯通塊中,顯然是不行的 不想離散化便直接上map mapma p了m ap mapma p 好啊 include in...
NOI 2015 程式自動分析
description 在實現程式自動分析的過程中,常常需要判定一些約束條件是否能被同時滿足。考慮乙個約束滿足問題的簡化版本 假設x1,x2,x3,代表程式中出現的變數,給定n個形如xi xj或xi xj的變數相等 不等的約束條件,請判定是否可以分別為每乙個變數賦予恰當的值,使得上述所有約束條件同時...
NOI 2015 程式自動分析
我覺得是noi史上最簡單的題目了,沒有之一。我們把相等的變數合併起來,然後最後在掃一遍不同的變數是否在乙個塊裡。可能變數很大,離散化一下。uojluogu bzoj cogs include include include using namespace std const int maxm 1e7...