居然開始寫水題題解了,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 的罪犯被關押在同...