CF441D


题目大意
给出一个有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的更多相关文章
随机推荐
- 杂项-Java:JSP
ylbtech-杂项-Java:JSP 1.返回顶部 1. JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Micros ...
- EasyUI Calendar 日历
转自:http://www.jeasyui.net/plugins/175.html 通过 $.fn.calendar.defaults 重写默认的 defaults. 日历(calendar)显示允 ...
- Java多线程系列四——控制线程执行顺序
假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...
- E20171121-sl
contrast n. 对比,对照; 差异; 对照物,对立面; [摄] 反差;
- 清北考前刷题day4下午好
/* 辗转相除,每次计算多出现了几个数. */ #include<iostream> #include<cstdio> #include<cstring> #inc ...
- Linux之线程相关命令及常用命令
查进程 top命令:查看系统的资源状况.#top top -d 10 //指定系统更新进程的时间为10秒 ps:查看当前用户的活动进程.#ps -A ps命令查找与进程相关的PID号: ps ...
- FTP文件服务器
import java.io.InputStream; import java.io.Serializable; import lombok.Data; @Data public class FtpB ...
- [BZOJ:3162]:独钓寒江雪
题解: 求本质不同的独立集的个数 首先独立集的个数是很好做的 \(f[u][0/1]\)表示节点\(u\)不选/选的方案数 然后dp就是 \(f[u][0] = f[u][0] * (f[v][0] ...
- UML中类之间的关系
UML中类之间的关系分为以下几种:依赖.关联.泛化.聚合.组合. 依赖是指一个类使用了另一个类,它是一种使用关系,描述了一个事物的规格说明的变化可能会影响到使用它的另一个事物(反之不一定).最常见的依 ...
- kafka启动时出现FATAL Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) java.io.IOException: Permission denied错误解决办法(图文详解)
首先,说明,我kafk的server.properties是 kafka的server.properties配置文件参考示范(图文详解)(多种方式) 问题详情 然后,我启动时,出现如下 [hadoop ...