2018年10月27日提高组 T3 序列

xiaoxiao2022-06-03  25

大意

给定 n n n个数,求连续长度不小于 k k k的最大按位或和按位与值


思路

按位或的最大值其实就是所有数或起来,因为 a   o r   b > = a a\ or\ b>=a a or b>=a 按位与的最大值其实就是 k k k个数与起来,因为 a   a n d   b < = a a\ and\ b<=a a and b<=a

所以我们只需要用位运算维护一个动态窗口即可


代码

#include<cstdio> #include<iostream> #include<algorithm> using namespace std;int n,k,ans2,ans1,now,a[1000001],v[1000001]; signed main() { scanf("%d%d",&n,&k); for(register int i=1;i<=n;i++) { scanf("%d",a+i); for(register int j=0;j<32;j++) v[j]+=(a[i]>>j)&1;//加上 if(i>=k) { int now=0; for(register int j=0;j<32;j++) { v[j]-=(a[i-k]>>j)&1;//删除最前面的 now+=(1<<j)*(v[j]==k);//计算 } if(now>ans2)ans2=now;//求最大值 } ans1|=a[i]; } printf("%d %d",ans1,ans2);//输出 }
转载请注明原文地址: https://www.6miu.com/read-4915029.html

最新回复(0)