jzoj 5352
題目大意
乙個有n
nn個點的完全圖,每條邊的邊權是ai⊕
aj
a_i \oplus a_j
ai⊕aj
,求最小生成樹的邊權和方案數
tj考慮按照最高位的 0/1
0/10/
1 分成兩堆,容易得出兩堆點之間有且僅有一條邊相連(最優情況下),於是用trie求出這條邊的最小邊權和方案數,然後兩邊遞迴下去,把所得的最小邊權相加,方案數相乘便可。
注意當t=0
t=0t=
0(其中t
tt是位數)是,剩下的點(設個數為x
xx)的方案數為xx−
2x^
xx−2
。
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define ll long long
const ll mod=
1e9+7;
const ll inf=
1e9+7;
using
namespace std;
const ll n=
1e5;
const ll m=n*30;
struct nodeans;
ll a[n+10]
,n,m,b[n+10]
,c[n+10]
,max,cnt1,cnt2,cnt;
ll ch[m][2
],bz[m+10]
;void
insert
(ll t,ll x)
else p=ch[p]
[y];
} bz[p]++;
}node search
(ll t,ll x)
return
(node);}
ll power
(ll x,ll n)
return a;
}node dfs
(ll t,ll l,ll r);if
(l==r)
return
(node)
; ll cnt1=
0,cnt2=0;
fo(i,l,r)if(
!cnt1 ||
!cnt2)
return
dfs(t-
1,l,r);fo
(i,1
,cnt1)a[i+l-1]
=b[i];fo
(i,1
,cnt2)a[l+cnt1+i-1]
=c[i]
; cnt=
1;ch[1]
[0]=ch[1]
[1]=
0;fo(i,
1,cnt1)
insert
(t,b[i]);
ll ret=inf,num=0;
node s;
fo(i,
1,cnt2)
node d=
dfs(t-
1,l,l+cnt1-1)
; node e=
dfs(t-
1,l+cnt1,r)
;return
(node);}
intmain()
20201017B組 T2 飛彈攔截
jzoj5354 題目大意 給出n nn n 1000 n le 1000 n 100 0 個三維座標xi,yi,z ix i,y i,z i xi yi zi 求任意排列下的最長上公升子串行和最小鏈覆蓋 前一問顯然用o n 2 o n 2 o n2 dp暴力求,你想用o n logn o nlog...
noip 2017 普及組 T3 棋盤
有乙個m m的棋盤,棋盤上每乙個格仔可能是紅色 黃色或沒有任何顏色的。你現在要從棋盤的最左上角走到棋盤的最右下角。任何乙個時刻,你所站在的位置必須是有顏色的 不能是無色的 你只能向上 下 左 右四個方向前進。當你從乙個格仔走向另乙個格仔時,如果兩個格仔的顏色相同,那你不需要花費金幣 如果不同,則你需...
NOIP2008 普及組 T3 傳球遊戲
上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個同...