题目大意

给出一个有n个数的序列

求符合 区间各数或起来的数大于区间最大数 的区间的个数

题解

预处理出每个数每一位是0的那位左边最近的1和右边最近的1,用单调栈找出每个最大值所在的区间的左右端点,统计答案即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
using namespace std;
const int maxn=,inf=2e9;
int n,top,st[maxn],a[maxn],digit[maxn][],pre[maxn][],Pre[maxn],next[maxn][],Next[maxn],cnt[maxn];
LL ans;
void read(int &k){
k=; int f=; char c=getchar();
while (c<''||c>'')c=='-'&&(f=-),c=getchar();
while (''<=c&&c<='')k=k*+c-'',c=getchar();
k*=f;
}
int main(){
read(n);
for (int i=;i<=n;i++){
read(a[i]);
for (int x=a[i];x;x>>=) digit[i][++cnt[i]]=x&; //处理出a[i]二进制下的每一位
}
////////////////////////////////////////////
//pre[i][j]表示:在第j位上,第i个数为0时,左边最近的为1的位置;next[i][j]为右边最近的1的位置
for (int j=;j<=;j++){
int last=;
for (int i=;i<=n;i++)
if (!digit[i][j]) pre[i][j]=last;
else last=i;
}
for (int j=;j<=;j++){
int first=n+;
for (int i=n;i;i--)
if (!digit[i][j]) next[i][j]=first;
else first=i;
}
////////////////////////////////////////////
//对于一个数,不合法区间的左端点为其各个为0数位上,左边最近的1的位置的最大值
//右端点为其各个为0数位上,右边最近的1的位置的最小值
//即对于maxnumber,它的每个为0位,不合法区间内的其他数的这一位都为0,这样区间or起来之后等于maxnumber
memset(Next,,sizeof(Next));
for (int i=;i<=n;i++)
for (int j=;j<=;j++) if (!digit[i][j])
Pre[i]=max(Pre[i],pre[i][j]),Next[i]=min(Next[i],next[i][j]);
//////////////////////////////////////////// 单调栈维护以a[i]为最大值的区间的左右端点
a[++n]=inf;
for (int i=;i<=n;i++){
for (;top&&a[i]>=a[st[top]];top--){
ans+=1LL*((i-)-st[top]+)*(st[top]-(st[top-]+)+); //以a[st[top]]为最大值的全部区间个数
ans-=1LL*(st[top]-max(st[top-]+,Pre[st[top]]+)+)*(min(i-,Next[st[top]]-)-st[top]+);
//减去不合法的区间个数
}
st[++top]=i;
}
printf("%lld\n",ans);
return ;
}

CF441D的更多相关文章

随机推荐

  1. Gamma的完全理解

    Gamma校正 问题:什么是Gamma曲线矫正?Gamma曲线矫正是什么意思?       Gamma曲线是一种特殊的色调曲线,当Gamma值等于1的时候,曲线为与坐标轴成45°的直线,这个时候表示输 ...

  2. WinRAR 激活码(KEY)

    引自:http://blog.sina.com.cn/s/blog_6fd3b4800100nyk0.html WinRAR 是一个强大的压缩文件管理工具.它能备份你的数据,减少你的 E-mail 附 ...

  3. spring-boot-configuration-processor的作用

    spring默认使用yml中的配置,但有时候要用传统的xml或properties配置,就需要使用spring-boot-configuration-processor了 先引入pom依赖 <d ...

  4. js滚轮事件需要注意的兼容性问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 自己编写的str操作函数

    1.strcat() 此函数原型为 char *strcat(char *dest, const char *src). 功能为连接两个字符串,把src连接到dest后面:返回dest地址 实现如下 ...

  6. 374 Guess Number Higher or Lower 猜数字大小

    我们正在玩一个猜数字游戏. 游戏规则如下:我从 1 到 n 选择一个数字. 你需要猜我选择了哪个数字.每次你猜错了,我会告诉你这个数字是大了还是小了.你调用一个预先定义好的接口 guess(int n ...

  7. 289 Game of Life 生命的游戏

    假设有一个大小为m*n的板子,有m行,n列个细胞.每个细胞有一个初始的状态,死亡或者存活.每个细胞和它的邻居(垂直,水平以及对角线).互动规则如下:1.当前细胞存活时,周围低于2个存活细胞时,该细胞死 ...

  8. scala学习笔记2:面向对象编程部分基础

    以下主要记录的是看完scala in programming这本书Functional Objects(第六章)后的要点总结. 1,程序中可变对象(var)和不可变对象(val)使用的权衡问题 不可变 ...

  9. redis 配置多个ip 解决方案

    因为在 redis 中bind 指定的ip 其实为同一网段或localhost 监听ip,在这里配置 内网其他网段或者外网多个ip 后  重启 redis 是不会成功的, 这边建议使用 折中方案,开通 ...

  10. C++(extern关键字的理解和作用深入)

    extern关键字的理解和作用深入 extern是一个关键字,它告诉编译器存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数, 也会在当前文件的后面或者其它文件中定义 引 ...