题意:给你n堆石子 每堆有ai个 现在问你有多少个连续的区间保证最大值小于等于该区间和的两倍

思路:我们可以考虑每个区间的分割点 总是该区间的最大值 所以我们只要ST找到该区间的最大值 然后每次都枚举较小的半区间 二分找到刚号满足的区间 这样我们就可累加个数了

注意边界的情况 本人用lower_bound找bug找到自闭

#include <bits/stdc++.h>
using namespace std;
const int N = 3e5+7;
const int inf = 0x3f3f3f3f;
typedef long long ll;
const ll mod = 1e7+9;
int a[N],f[N][30],mm[N];
ll sum[N];
int n;
int max(int i,int j){
if(a[i]>=a[j]) return i;
else return j;
}
void preST(int len){
mm[0]=-1;
for(int i=1;i<=len;i++){
mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
f[i][0]=i;
}
for(int j=1;j<=mm[len];j++)
for(int i=1;i<=(len-(1<<j)+1);i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
//[i,i+2^j-1]最大值即是 i~i+2^(j-1)和 i+2^(j-1)~i+2^(j-1)+2^(j-1) 这两半区间的较大值
}
int queryST(int l,int r){
int k=mm[r-l+1]; //保证k满足 2^k<r+l-1<=2^(k+1)
return max(f[l][k],f[r-(1<<k)+1][k]);
}
ll ans=0;
void solve(int l,int r){
if(l>=r) return ;
int mid=(l+r)>>1;
int x=queryST(l,r);
if(x<=mid){
for(int i=l;i<=x;i++){
int po=lower_bound(sum+x,sum+r+1,sum[i-1]+2*a[x])-sum;
ans+=(r-po+1);
}
}else{
for(int i=x;i<=r;i++){
int po=upper_bound(sum+l-1,sum+x,sum[i]-2*a[x])-sum;
ans+=(po-l+1);
}
}
solve(l,x-1);
solve(x+1,r);
}
int main(){
// ios::sync_with_stdio(false);
// cin.tie(0); cout.tie(0);
int t; scanf("%d",&t);
while(t--){
scanf("%d",&n);
ans=0;
for(int i=1;i<=n;i++)
scanf("%d",a+i),sum[i]=sum[i-1]+a[i];
preST(n);
solve(1,n);
printf("%lld\n",ans);
}
}

最新文章

  1. 彻底解决m2eclipse之Unable to update index for central
  2. C#基础知识系列五(构造函数)
  3. 【linux】awk的使用
  4. jquery html 动态添加元素绑定事件
  5. sqlplus查看服务名
  6. NFS 配置服务
  7. Centos 6.5升级到Git2.1.2的步骤
  8. 克隆虚拟机以及两台linux机器相互登录:linux学习第四篇
  9. js变量污染引起的诡异bug
  10. Redis常用命令与配置
  11. 【Java】 剑指offer(48) 最长不含重复字符的子字符串
  12. python threading acquire release
  13. Jenkins mac pkg安装 后默认配置文件/启动路径
  14. ganglia
  15. Simple2D-21(重构)渲染部分
  16. [Meteor] meteor project structure
  17. (待修莫队 没过! 抽空在检查)Dynamic len(set(a[L:R])) UVA - 12345
  18. opencv 摄像头
  19. Servlet介绍以及简单实例
  20. python 实现二叉树相关算法

热门文章

  1. idea thymeleaf页面变量报错解决
  2. Petalinux和Vivado的安装
  3. 【JavaWeb】现代 JavaScript 教程
  4. LeetCode841 钥匙和房间
  5. 深入理解MySQL索引(下)
  6. HDU6375双端队列
  7. Android事件分发机制一:事件是如何到达activity的?
  8. MongoDB导出导入功能
  9. 使用 C# 9 的records作为强类型ID - JSON序列化
  10. 通过show status 命令了解各种sql的执行频率