題目意思:
有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...