20201017B組T3 計數題

2021-10-24 23:14:05 字數 1728 閱讀 9105

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個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出去的那個同...