51nod 1515 明辨是非

2021-09-01 00:23:56 字數 1171 閱讀 2348

給n組操作,每組操作形式為x y p。

當p為1時,如果第x變數和第y個變數可以相等,則輸出yes,並限制他們相等;否則輸出no,並忽略此次操作。

當p為0時,如果第x變數和第y個變數可以不相等,則輸出yes,並限制他們不相等 ;否則輸出no,並忽略此次操作。

輸入乙個數n表示操作的次數(n<=1*10^5)

接下來n行每行三個數x,y,p(x,y<=1*10^8,p=0 or 1)

對於n行操作,分別輸出n行yes或者no
3

1 2 1

1 3 1

2 3 0

yes

yesno

思路:

由於輸入資料數值太大,因此需要用map將每個輸入值對映到從1開始的連續值。

對於互斥的情況,在每個值安排乙個set結構來記錄與之互斥的值。

對於相同的情況,用並查集進行合即可,合併時將互斥數量小的合併到互斥數量大的,並且拷貝原來的互斥值。

#include #include #include using namespace std;

const int maxn = 2e5 + 10;

int n, num = 1;

int fa[maxn];

int x, y, p;

setdif[maxn];

maptable;

int find(int x)

return fa[x];

}int main()

while (n--)

else

it = table.find(y);

if (it != table.end())

else

x = find(x);

y = find(y);

if (p == 1)

else if (x == y)

else

fa[x] = y;

for (it = dif[x].begin(); it != dif[x].end(); it++)

puts("yes");

}} 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

注意這題跟種類並查集不沾邊 因為a b b c推不出a c 對於每個集合u 把所有與u不等的集合v1 v2.都存入乙個vector 在合併u與v時 對其中vector元素較少的乙個進行遍歷 判斷是否包含另乙個集合 即啟發式合併 include include include include usin...