題目
但是我們得到的答案可能會有重複,就是我們可能把乙個數選入左集合或右集合,但是都加入了狀態,所以我們需要判重。
如何去判重,狀態壓縮,壓成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想把這些牛安置...