單調性優化 hdu 4737 A Bit Fun

2021-06-18 10:33:36 字數 1202 閱讀 6407

題目意思:

有n個數,求區間l,r的個數使得該區間內所有數或的值小於m.

解題思路:

這題比賽的時候暴力過的。資料太水不解釋。

這題可以利用單調性降低時間複雜度。

分段來求,依次找到以j結束的恰好構成或值小於m的i,然後剔除包括該區間【i,j】的所有區間。

**:#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define eps 1e-6

#define inf 0x3fffffff

#define pi acos(-1.0)

#define ll __int64

#define lson l,m,(rt<<1)

#define rson m+1,r,(rt<<1)|1

#pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

#define maxn 110000

//單調性思想 根據單調性 降低複雜度 由於是或運算,所以儲存位

int bit[35],num[35],sa[maxn]; //bit[i]=2^i

int main()

{ int t,n,m;

bit[0]=1;

for(int i=1;i<=31;i++)

bit[i]=bit[i-1]*2;

scanf("%d",&t);

for(int ca=1;ca<=t;ca++)

{scanf("%d%d",&n,&m);

for(int i=1;i<=n;i++)

scanf("%d",&sa[i]);

int i=1,j=1,last=1;

memset(num,0,sizeof(num));

ll ans=(ll)n*(n+1)/2; //注意是+1,因為當區間為乙個點時,只計算了一次

while(j<=n)

{for(int k=0;k<=31;k++)

if(sa[j]&(1<=m) //多了

{while(sum>=m) //把頭剔除一部分

{for(int k=0;k<=31;k++)

if(sa[i]&(1<

決策單調性優化DP 分治優化決策單調性

前言 本來這篇已經寫了 frac 了 然後我關機時忘儲存了。華麗的分割線 對於類似於 dp i j max min dp k 1 j 1 count k,i 不妨設 當 最後一次 max min 更新時 f i,j k 若有 forall i,j in 1,n s.t.i j rightarrow ...

單調佇列優化和決策單調性優化

有時狀態轉移方程形如f i j min w i,j 其中l i,j k j,l i,j l i,j 1 如果兩個決策k1,k2滿足f i 1 k1 f i 1 k2 且k1 k2,那麼k1出現後k2就沒用了。維護乙個佇列,按k從小到大存下所有有用的決策,f i 1 k 是單調上公升的。每次加入新決策...

決策單調性優化,玄學 「for me「

例子 ans i max a j sqrt i j j i 大致意思 i位置的答案等於從i前面選乙個j位置,使得表示式最大。那麼,當咱們已經求出 i 的最大值就是在 j 位置的時候,求比 i 大的位置的答案的時候它的範圍應該是怎樣的呢?假設 a j sqrt i j a k sqrt i k j k...