题目大意

给出一个有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. CentOS 6.3下源码编译安装LAMP

    一.简介 什么是LAMP    LAMP是一种Web网络应用和开发环境,是Linux, Apache, MySQL, Php/Perl的缩写,每一个字母代表了一个组件,每个组件就其本身而言都是在它所代 ...

  2. 【废弃】【WIP】JavaScript Object

    创建: 2017/11/03 废弃: 2019/02/19 重构此篇.原文归入废弃  增加[废弃中]标签与总体任务 结束: 2019/03/03 完成废弃, 删除[废弃中]标签, 添加[废弃]标签 T ...

  3. bzoj 2100: [Usaco2010 Dec]Apple Delivery【spfa】

    洛谷数据好强啊,普通spfa开o2都过不了,要加双端队列优化 因为是双向边,所以dis(u,v)=dis(v,u),所以分别以pa1和pa2为起点spfa一遍,表示pb-->pa1-->p ...

  4. P3822 [NOI2017]整数

    传送门 shadowice大佬已经写的非常详细了我就不再写一遍了-- //minamoto #include<bits/stdc++.h> #define u unsigned int # ...

  5. robotframework - 基础关键词

    robotframework基础关键词如下: 1.可在python.notepad++ 编辑: *** Settings *** *** Test Cases ***variable ${a} Set ...

  6. mysql机制总结

    Innodb和myisam最大的不同就是 innodb支持事物 采用了行锁 myisam 采用了表锁 默认就使用了表锁 表锁:速度快 并发小 发生锁冲突高 开销小 行锁:速度慢 并发高 发生锁冲突低 ...

  7. 自动生成 html5 小页面

    StringBuilder htmltext = new StringBuilder();            try            {                //var readP ...

  8. [转]c 语言中 %d,%lu等区别

    转载至:http://blog.sina.com.cn/s/blog_7d94c35c01019f96.html %d 有符号10进制整数 %ld 长整型 %hd短整型 %hu 无符号短整形 %u无符 ...

  9. 二分图最大匹配(匈牙利算法) URAL 1721 Two Sides of the Same Coin

    题目传送门 /* 题意:三种人,statements,testdata,anthing.要求两个人能完成s和t两个工作,且rank相差2 二分图匹配:此题学习建图技巧,两个集和内部一定没有边相连,ra ...

  10. 用Movie显示gif(1)SimpleGif

    代码如下: import android.content.Context; import android.graphics.Canvas; import android.graphics.Movie; ...