p3067 平衡的奶牛群 折半列舉

2021-09-22 22:35:40 字數 1994 閱讀 7856

題目

但是我們得到的答案可能會有重複,就是我們可能把乙個數選入左集合或右集合,但是都加入了狀態,所以我們需要判重。

如何去判重,狀態壓縮,壓成2進製去判重。

所以統計時時還要去記錄狀態,用乙個vis判重。

if(!vis[a[i].sta|b[j].sta])

vis[a[i].sta|b[j].sta]=1;//sta記錄二進位制的選數狀態 1表示選 0表示沒選

最後要統計答案,排序後雙指標掃瞄一遍即可。

注意,最後別忘了把0的那種方案減去。

這個尺取法的話,假如a[i].ans好多數都相同,每次 j 都要回來,會tle。

但是我看的別人的**沒有tle,明明都一樣了(t_t) 下面**是乙個測試點tle(96分)

#include

#include

#include

#include

#define m(a,b) memset(a,b,sizeof a)

#define en '\n'

using

namespace std;

typedef

long

long ll;

const

int n=

6e4,m=

1e6+

5e4;

struct nodea[n]

,b[n]

;int c[22]

,tot1,tot2,r,n;

int vis[m]

;template

<

typename t>

inline

void

rd(t &a)

while

(isdigit

(c))

a=f*x;

}void

dfs(

int pos,

int sum,

int sta)

;else

b[++tot2]

=(node)

;return;}

dfs(pos+

1,sum,sta)

;dfs

(pos+

1,sum+c[pos]

,sta+(1

<<

(pos-1)

));dfs

(pos+

1,sum-c[pos]

,sta+(1

<<

(pos-1)

));}

inline

bool

cmp1

(node x,node y)

inline

bool

cmp2

(node x,node y)

intmain()

if(i!=tot1&&a[i+1]

.ans==a[i]

.ans)

//r要回到當初剛b[r].ans=-a[i].ans的位置.

j=tmp;

++i;

}printf

("%lld\n"

,sum-1)

;//減去空集.

return0;

}

P1296 奶牛的耳語

在你的養牛場,所有的奶牛都養在一排呈直線的牛欄中。一共有n頭奶牛,其中第i頭牛在直線上所處的位置可以用乙個整數座標pi 0 pi 10 8 來表示。在無聊的日子裡,奶牛們常常在自己的牛欄裡與其它奶牛交流一些八卦新聞。每頭奶牛發出的聲音響度是一樣的,而由於聲波的能量衰減,某頭奶牛發出的聲音只能被與它距...

P1023 奶牛的鍛鍊

p1023奶牛的鍛鍊 usaco 奶牛bessie有n分鐘時間跑步,每分鐘她可以跑步或者休息。若她在第i分鐘跑步,可以跑出d i公尺,同時疲倦程度增加1 初始為0 若她在第i分鐘休息,則疲倦程度減少1。無論何時,疲倦程度都不能超過m。另外,一旦她開始休息,只有當疲憊程度減為0時才能重新開始跑步。在第...

P1824 進擊的奶牛

farmer john建造了乙個有n 2 n 100,000 個隔間的牛棚,這些隔間分布在一條直線上,座標是x1,xn 0 xi 1,000,000,000 他的c 2 c n 頭牛不滿於隔間的位置分布,它們為牛棚裡其他的牛的存在而憤怒。為了防止牛之間的互相打鬥,farmer john想把這些牛安置...