BZOJ 4195 程式自動分析【並查集+離散化】
Description
在實現程式自動分析的過程中,常常需要判定一些約束條件是否能被同時滿足。
考慮一個約束滿足問題的簡化版本:假設x1,x2,x3,…代表程式中出現的變數,給定n個形如xi=xj或xi≠xj的變數相等/不等的約束條件,請判定是否可以分別為每一個變數賦予恰當的值,使得上述所有約束條件同時被滿足。例如,一個問題中的約束條件為:x1=x2,x2=x3,x3=x4,x1≠x4,這些約束條件顯然是不可能同時被滿足的,因此這個問題應判定為不可被滿足。
現在給出一些約束滿足問題,請分別對它們進行判定。
Input
輸入檔案的第1行包含1個正整數t,表示需要判定的問題個數。注意這些問題之間是相互獨立的。
對於每個問題,包含若干行:
第1行包含1個正整數n,表示該問題中需要被滿足的約束條件個數。
接下來n行,每行包括3個整數i,j,e,描述1個相等/不等的約束條件,相鄰整數之間用單個空格隔開。若e=1,則該約束條件為xi=xj;若e=0,則該約束條件為xi≠xj。
Output
輸出檔案包括t行。
輸出檔案的第k行輸出一個字串“YES”或者“NO”(不包含引號,字母全部大寫),“YES”表示輸入中的第k個問題判定為可以被滿足,“NO”表示不可被滿足。
Sample Input
2
2
1 2 1
1 2 0
2
1 2 1
2 1 1
Sample Output
NO
YES
HINT
在第一個問題中,約束條件為:x1=x2,x1≠x2。這兩個約束條件互相矛盾,因此不可被同時滿足。
在第二個問題中,約束條件為:x1=x2,x2=x1。這兩個約束條件是等價的,可以被同時滿足。
1≤n≤1000000
1≤i,j≤1000000000
題解:資料範圍比較大,必須先進行離散化處理。然後就是並查集了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn = 1000000;
struct node {
int i, j;
int e;
}a[maxn];
int fa[maxn], b[maxn<<1|1];
int get(int x){
if(x == fa[x]) return x;
return fa[x] = get(fa[x]);
}
void Merge(int x, int y){
fa[get(x)] = get(y);
}
int main()
{
int t, n;
scanf("%d", &t);
while(t--) {
int id = 0;
memset(fa, -1, sizeof fa);
scanf("%d", &n);
int flag = 1;
for(int i = 1; i <= n; i++) {
scanf("%d %d %d", &a[i].i, &a[i].j, &a[i].e);
b[++id] = a[i].i, b[++id] = a[i].j;
}
sort(b+1, b+id+1);
//tot = unique(b, b+id);
for(int i = 1; i <= id; i++)
fa[i] = i;
for(int i = 1; i <= n; i++){
if(a[i].e == 1){
int x = lower_bound(b, b+id, a[i].i) - b;
int y = lower_bound(b, b+id, a[i].j) - b;
Merge(x, y);
}
}
for(int i = 1; i <= n; i++){
if(!a[i].e){
int x = lower_bound(b, b+id, a[i].i) - b;
int y = lower_bound(b, b+id, a[i].j) - b;
if(get(x) == get(y)){
flag = 0;
break;
}
}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
相關文章
- bzoj4195: [Noi2015]程式自動分析(離散化+並查集)並查集
- 【並查集】【離散化】[NOI2015] 程式自動分析並查集
- C128 並查集+離散化 P1955 [NOI2015] 程式自動分析並查集
- BZOJ 3673 可持久化並查集 by zky 可持續化線段樹+並查集啟發式合併持久化並查集
- bzoj2079: [Poi2010]Guilds(並查集)GUI並查集
- bzoj4690: Never Wait for Weights(帶權並查集)AI並查集
- 離散化
- BZOJ 1997: [Hnoi2010]Planar 2-SAT+並查集並查集
- bzoj3296: [USACO2011 Open] Learning Languages(並查集)並查集
- bzoj1529: [POI2005]ska Piggy banks(並查集)並查集
- bzoj2733: [HNOI2012]永無鄉(並查集+主席樹)並查集
- bzoj3444: 最後的晚餐(並查集+組合數學)並查集
- 並查集到帶權並查集並查集
- 自動查詢並分析快遞的物流狀態
- 並查集系列之「思路優化」並查集優化
- 查並集
- 【並查集】【帶偏移的並查集】食物鏈並查集
- 並查集系列之「思路最佳化」並查集
- 【題解】Solution Set - NOIP2024集訓Day8 並查集和可持久化並查集並查集持久化
- 並查集(一)並查集的幾種實現並查集
- 3.1並查集並查集
- 並查集(小白)並查集
- [leetcode] 並查集(Ⅱ)LeetCode並查集
- [leetcode] 並查集(Ⅲ)LeetCode並查集
- [leetcode] 並查集(Ⅰ)LeetCode並查集
- 二維座標離散化模板
- 【離散優化】覆蓋問題優化
- Making the Grade POJ - 3666(離散化+dp)
- 淺談並查集並查集
- 食物鏈(並查集)並查集
- 並查集跳躍並查集
- 各種並查集並查集
- 寫模板, 並查集。並查集
- 並查集(Union Find)並查集
- The Door Problem 並查集並查集
- 並查集練習並查集
- 並查集應用並查集
- 並查集的使用並查集