百度之星初賽(A) T2

2022-04-30 08:00:11 字數 1931 閱讀 4834

這個程式接受一些形如x_i = x_jx​i​​=x​j​​ 或 x_i \neq x_jx​i​​≠x​j​​ 的相等/不等約束條件作為輸入,判定是否可以通過給每個 w 賦適當的值,來滿足這些條件。

輸入包含多組資料。 然而粗心的小w不幸地把每組資料之間的分隔符刪掉了。 他只知道每組資料都是不可滿足的,且若把每組資料的最後乙個約束條件去掉,則該組資料是可滿足的。

請幫助他恢復這些分隔符。

input

第11行:乙個數字ll,表示後面輸入的總行數。

之後ll行,每行包含三個整數,i,j,ei,j,e,描述乙個相等/不等的約束條件,若e=1e=1,則該約束條件為x_i = x_jx​i​​=x​j​​ ,若e=0e=0,則該約束條件為 x_i \neq x_jx​i​​≠x​j​​ 。

i,j,l \leq 100000i,j,l≤100000

x_i , x_j \leq lx​i​​,x​j​​≤l

output

輸出共t+1t+1行。

第一行乙個整數tt,表示資料組數。

接下來tt行的第ii行,乙個整數,表示第i組資料中的約束條件個數。

sample input

6

2 2 1

2 2 1

1 1 1

3 1 1

1 3 1

1 3 0

sample output

1

6———————————————————————————————————————

因為相等具有傳遞性所以我們可以用並查集維護一波

但是不等於不具有傳遞性所以我們可以用平衡樹維護一波

當然這裡我用的是set

這樣之後呢 等於我們就可以把他們扔在乙個並查集裡面

不等於的就把不等於他的扔進他的平衡樹裡面

每次詢問

如果是一對相等的數

我們就找一波他們是否在同乙個並查集裡 是就直接繼續下一波

不是就找他們是否存在對方的平衡樹裡面 當然這裡我們強行把size小的合併進大的裡面保證複雜度

如果是不相等就判斷他們是否同屬乙個並查集

是就清空一波 記錄答案

不然就把他們加入對方的平衡樹裡面

#include#include

#include

#include

using

namespace

std;

intread()

while(c>='

0'&&c<='9')

return ans*f;

}int t,f[200007

];int find(int x)

settr[200007

];int vis[200007],cnt=1

;int ans[200007

],ap;

int stk[200007

],stp;

inta,b,h;

void

clear()

++cnt;

}int

main()

f[q]=p;

for(set

::iterator it=tr[q].begin();it!=tr[q].end();it++)

tr[q].clear();

}else

tr[p].insert(q);

tr[q].insert(p);}}

printf(

"%d\n

",ap);

for(int i=1;i<=ap;i++) printf("

%d\n

",ans[i]-ans[i-1

]);

return0;

}

view code

百度之星 初賽B

a 傳送門 點我 求聯通塊個數,對於簡單圖而言,就是c v e,其中c就是聯通塊個數,v是頂點數,e是邊數 include include include include using namespace std const int max n 2e5 10 int n,m,k vectorg max...

百度之星2017初賽題解(A)

t1 簡單數論,問滿足 a0 a1 b an b n a0 a1 an mod p 的p的個數 即滿足p b 1 a1 b 2 1 a2 b 3 1 a3 即p b 1的p的個數 sqrt b 1 暴力列舉b 1約數即可 t2 現在給若干個條件,xi xj或xi xj,要你將它們劃分成若干組,滿足每...

2018百度之星初賽1003

problem description 度度熊有一張紙條和一把剪刀。紙條上依次寫著 n 個數字,數字只可能是 0 或者 1。度度熊想在紙條上剪 k 刀 每一刀只能剪在數字和數字之間 這樣就形成了 k 1 段。他再把這 k 1 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊...