noip2010關押罪犯

2022-05-07 23:45:20 字數 2492 閱讀 4729

居然開始寫水題題解了,noip退役預定

戳我這道題似乎有三種做法:

我們知道,如果要求兩個人不衝突,它們必須在不同監獄裡。

然而總共也只有兩個監獄啊。

所以對於乙個人來說,要麼和另乙個人在同一監獄,要麼和另一人不在同一監獄。

這種二分圖式的排斥關係,其實可以用並查集的補集來表示。

#include#include#include#include#include#include#include#define ll long long

#define re register

#define il inline

#define fp(i,a,b) for(re int i=a;i<=b;++i)

#define fq(i,a,b) for(re int i=a;i>=b;--i)

using namespace std;

const int n=1e5+100;

int n,m,f[n];

il int find(re int x)

struct dat}a[n];

il ll gi()

il void cmax(re int &x,re int y)

int main()

; }

sort(a+1,a+1+m);

fp(i,1,m)

puts("0");

return 0;

}

仔細看看題,你會發現,要求的其實是最小化的最大值。

這種問題可以二分。

於是只連權值大於\(mid\)的邊。

然後判斷所有邊的兩端是否能去不同的監獄。

這個可以用二分圖染色完成。

#include#include#include#include#include#include#include#define ll long long

#define re register

#define il inline

#define fp(i,a,b) for(re int i=a;i<=b;++i)

#define fq(i,a,b) for(re int i=a;i>=b;--i)

using namespace std;

const int n=1e5+100;

int n,m,h[n],cnt,col[n],tag;

struct edgee[n<<1];

struct dat}a[n];

il void add(re int u,re int v);h[u]=cnt;}

il ll gi()

il void dfs(re int u)

}}il int check(re int x)

il void cmax(re int &x,re int y)

int main()

; }

sort(a+1,a+1+m);

re int l=0,r=a[1].w,ans=0;

while(l<=r)

printf("%d\n",ans);

return 0;

}

眾所周知,要形成二分圖,圖中不能有奇環。

所以我們把邊按邊權排序後,只要一條邊加入後形成了奇環,就可以輸出答案了。

所以怎麼判呢?

判是否形成環可以用並查集,判形成的環是否是奇環當然也可以用並查集。

因為每次連邊,我們都是把並差集的根結點相連。

如果在之前根結點已經相連,再連邊就會形成環。

環的大小嗎,就是兩端點分別離根結點的距離之和\(+1\)。(當然不能路徑壓縮)

所以每次合併時,我們維護一下每個點到其並查集父親距離的奇偶性。

求環大小時,從兩端點分別暴跳父親即可。

#include#include#include#include#include#include#define ll long long

#define re register

#define il inline

#define pc(a) putchar(a)

#define fp(i,a,b) for(re int i=a;i<=b;i++)

#define fq(i,a,b) for(re int i=a;i>=b;i--)

using namespace std;

const int n=2e5+100,inf=1e9+100;

int f[n],n,m,dp[n],h[n];

bool vis[n];

ll ans;

struct dat}a[n<<1];

il int find(re int x)

il int dis(re int x)

il int gi()

int main()

}puts("0");

return 0;

}

noip2010 關押罪犯

s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極 不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨 氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之 間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監...

NOIP2010關押罪犯

s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...

NOIP 2010 關押罪犯

題目描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同...