题目:http://codeforces.com/contest/1156/problem/E

题意:给你1-n  n个数,然后求有多少个区间[l,r] 满足    a[l]+a[r]=max([l,r])

思路:首先我们去枚举区间肯定不现实,我们只能取把能用的区间去用,我们可以想下每个数当最大值的时候所做的贡献

我们既然要保证这个数为区间里的最大值,我们就要从两边扩展,找到左右边界能扩展在哪里,这里你直接去枚举肯定不行

这里我们使用了线段树二分去枚举左右区间最远能走到哪里,然后很暴力的去枚举短的那一边找出右边是否有满足条件的边界

#include<bits/stdc++.h>
#define maxn 200005
#define mod 1000000007
using namespace std;
typedef long long ll;
struct sss
{
int l,r;
int val;
}tree[maxn*];
int n;
int a[maxn];
int pos[maxn];
void build(int cnt,int l,int r)
{
if(l==r){
tree[cnt].l=l;
tree[cnt].r=r;
tree[cnt].val=a[l];
return;
}
tree[cnt].l=l;
tree[cnt].r=r;
int mid=(l+r)/;
build(cnt*,l,mid);
build(cnt*+,mid+,r);
tree[cnt].val=max(tree[cnt*].val,tree[cnt*+].val);
}
int query(int cnt,int l,int r)
{
if(l<=tree[cnt].l&&r>=tree[cnt].r) return tree[cnt].val;
int mid=(tree[cnt].l+tree[cnt].r)/;
if(r<=mid) return query(cnt*,l,r);
else if(l>mid) return query(cnt*+,l,r);
else{
return max(query(cnt*,l,mid),query(cnt*+,mid+,r));
} }
int dl(int x)
{
int val=a[x];
int l=;
int r=x;
while(r-l>){
int mid=(l+r)/;
int max_val=query(,mid,x); //如果满足这个区间的最大值是这个数就继续扩张
if(max_val==val)
{
r=mid;
}
else{
l=mid;
}
}
int max_val=query(,l,x);
if(max_val==val) return l;
else return r;
}
int dr(int x)
{
int val=a[x];
int l=x;
int r=n;
while(r-l>){
int mid=(l+r)/;
int max_val=query(,x,mid);
if(max_val==val)
{
l=mid;
}
else{
r=mid;
}
}
int max_val=query(,x,r);
if(max_val==val) return r;
else return l;
}
int main()
{
cin>>n;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
pos[a[i]]=i;
}
build(,,n);
int ans=;
for(int i=;i<=n;i++){
int l=dl(i);//找出左边界
int r=dr(i);//找出右边界
if(i-l<r-i){//枚举短的那一边
for(int j=l;j<i;j++){
int other=a[i]-a[j];
if (other<=||other>n)continue;
ans+=pos[other]>i&&pos[other]<=r;//确定令一边是否在这个区间里面
}
}
else{
for(int j=i+;j<=r;j++){
int other=a[i]-a[j];
if (other<=||other>n)continue;
ans+=pos[other]<i&&pos[other]>=l;
}
}
}
printf("%d",ans);
}

最新文章

  1. ACM 中 矩阵数据的预处理 &amp;&amp; 求子矩阵元素和问题
  2. 使用Concurrency Visualizer优化性能
  3. hdu 1839 Delay Constrained Maximum Capacity Path 二分/最短路
  4. Android 面试精华题目总结
  5. Session小案例------完成用户登录
  6. 《JS权威指南学习总结--9.1 类和模板》
  7. Java常见异常处理
  8. 代码管理 ,git 命令整理
  9. [转] Vmware vs Virtualbox vs KVM vs XEN: virtual machines performance comparison
  10. 论如何优雅的自定义ThreadPoolExecutor线程池
  11. 通过IEnumerable接口遍历数据
  12. 面向对象【day07】:新式类和经典类(八)
  13. spring-boot集成spring-data-jpa
  14. Java数组、集合
  15. MBCS与Unicode的转换
  16. jQuery实现radio第一次点击选中第二次点击取消功能(转)
  17. BZOJ 2194 快速傅立叶变换之二 | FFT
  18. solr学习之六--------Analyzer(分析器)、Tokenizer(分词器)
  19. mariadb主从备份
  20. Oracle数据库count的一些操作

热门文章

  1. [CSP-S模拟测试47]反思+题解
  2. 探索Redis设计与实现12:浅析Redis主从复制
  3. 用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验
  4. WebGPU学习(九):学习“fractalCube”示例
  5. upc组队赛3 Chaarshanbegaan at Cafebazaar
  6. CS如何调用JS
  7. Xshell与securecrt对比
  8. 用java api 实现查询 Hive 数据
  9. 如何安装python运行环境Anaconda
  10. 【足迹C++primer】47、Moving Objects(2)