這個程式接受一些形如x_i = x_jxi=xj 或 x_i \neq x_jxi≠xj 的相等/不等約束條件作為輸入,判定是否可以通過給每個 w 賦適當的值,來滿足這些條件。
輸入包含多組資料。 然而粗心的小w不幸地把每組資料之間的分隔符刪掉了。 他只知道每組資料都是不可滿足的,且若把每組資料的最後乙個約束條件去掉,則該組資料是可滿足的。
請幫助他恢復這些分隔符。
input
第11行:乙個數字ll,表示後面輸入的總行數。
之後ll行,每行包含三個整數,i,j,ei,j,e,描述乙個相等/不等的約束條件,若e=1e=1,則該約束條件為x_i = x_jxi=xj ,若e=0e=0,則該約束條件為 x_i \neq x_jxi≠xj 。
i,j,l \leq 100000i,j,l≤100000
x_i , x_j \leq lxi,xj≤l
output
輸出共t+1t+1行。
第一行乙個整數tt,表示資料組數。
接下來tt行的第ii行,乙個整數,表示第i組資料中的約束條件個數。
sample input
6sample output2 2 1
2 2 1
1 1 1
3 1 1
1 3 1
1 3 0
16———————————————————————————————————————
因為相等具有傳遞性所以我們可以用並查集維護一波
但是不等於不具有傳遞性所以我們可以用平衡樹維護一波
當然這裡我用的是set
這樣之後呢 等於我們就可以把他們扔在乙個並查集裡面
不等於的就把不等於他的扔進他的平衡樹裡面
每次詢問
如果是一對相等的數
我們就找一波他們是否在同乙個並查集裡 是就直接繼續下一波
不是就找他們是否存在對方的平衡樹裡面 當然這裡我們強行把size小的合併進大的裡面保證複雜度
如果是不相等就判斷他們是否同屬乙個並查集
是就清空一波 記錄答案
不然就把他們加入對方的平衡樹裡面
#include#includeview code#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;
}
百度之星 初賽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 段按一定的順序重新拼起來。不同的剪和接的方案,可能會得到不同的結果。度度熊...