給n組操作,每組操作形式為x y p。
當p為1時,如果第x變數和第y個變數可以相等,則輸出yes,並限制他們相等;否則輸出no,並忽略此次操作。
當p為0時,如果第x變數和第y個變數可以不相等,則輸出yes,並限制他們不相等 ;否則輸出no,並忽略此次操作。
input
輸入乙個數n表示操作的次數(n<=1*10^5)output接下來n行每行三個數x,y,p(x,y<=1*10^8,p=0 or 1)
對於n行操作,分別輸出n行yes或者noinput示例
3output示例1 2 1
1 3 1
2 3 0
yesyesno
/*51 nod 1515 明辨是非(並查集合並)
problem:
兩種操作:
x y 1: 如果第x,第y個數可以相同,則輸出yes,並令他們相同. 否則輸出no
x y 0: 如果第x,第y個數可以不相同 ......
solve:
相同可以用並查集來維護. 但是不同則不行, 如果a,b不同, b,c不同.但是a,c可以相同. 開始腦子抽了都用並查集 卒...
先set記錄一下每個數與其不同的數有哪些. 然後判斷兩個數是否不相等時直接進行查詢.並要判斷他們各自所在的並查集
合併的時候再把set處理一下就好. printf一直tl,換成putsac.
hhh-2016/09/04-17:18:40
*/#pragma comment(linker,"/stack:124000000,124000000")
#include #include #include #include #include #include #include #include #include #include #define lson i<<1
#define rson i<<1|1
#define ll long long
#define clr(a,b) memset(a,b,sizeof(a))
#define scanfi(a) scanf("%d",&a)
#define scanfs(a) scanf("%s",a)
#define scanfl(a) scanf("%i64d",&a)
#define scanfd(a) scanf("%lf",&a)
#define key_val ch[ch[root][1]][0]
#define eps 1e-7
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
const ll mod = 1000000007;
const int maxn = 200010;
const double pi = acos(-1.0);
struct node
qry[maxn];
int id[maxn];
setq[maxn];
mapmp;
set::iterator it;
int par[maxn];
int fin(int x)
void unio(int x,int y)
par[x] = y;
for(it = q[x].begin(); it != q[x].end(); it++)
}int main()
sort(id,id+cnt);
int total = unique(id,id+cnt)-id;
for(int i = 0; i < total; i++)
mp[id[i]] = i;
// cout << total }
}else}}
if(flag)
puts("no");
else
}else}}
return 0;
}
51Nod 1515 明辨是非
給n組操作,每組操作形式為x y p。當p為1時,如果第x變數和第y個變數可以相等,則輸出yes,並限制他們相等 否則輸出no,並忽略此次操作。當p為0時,如果第x變數和第y個變數可以不相等,則輸出yes,並限制他們不相等 否則輸出no,並忽略此次操作。這是一道很經典的題目。如果只有強制相同集合的話...
51nod1515明辨是非
1515 明辨是非 基準時間限制 1 秒 空間限制 131072 kb 分值 160 難度 6級 給n組操作,每組操作形式為x y p。當p為1時,如果第x變數和第y個變數可以相等,則輸出yes,並限制他們相等 否則輸出no,並忽略此次操作。當p為0時,如果第x變數和第y個變數可以不相等,則輸出ye...
51nod 1515 明辨是非
給n組操作,每組操作形式為x y p。當p為1時,如果第x變數和第y個變數可以相等,則輸出yes,並限制他們相等 否則輸出no,並忽略此次操作。當p為0時,如果第x變數和第y個變數可以不相等,則輸出yes,並限制他們不相等 否則輸出no,並忽略此次操作。輸入乙個數n表示操作的次數 n 1 10 5 ...