51nod 1962区间计数(单调栈加二分)
2024-10-19 13:28:18
题目要求是求出两个序列中处于相同位置区间并且最大值相同的区间个数,我们最直观的感受就是求出每个区间的最大值,这个可以O(N)的求,利用单调栈求出每个数作为最大值能够覆盖的区间。
然后我们可以在进行单调栈的时候统计一下答案,怎么统计呢?就是在一个数列弹栈的时候在另一个数列的单调栈中找到这个数,然后分别算出两个数列中所对应的区间,然后统计一下左端点和右端点能够取到的所有位置利用乘法原理求一下即可。—— by VANE
#include<bits/stdc++.h>
using namespace std;
const int N=4e5+;
int n;
typedef long long ll;
ll ans;
int a[N][],q[N][],s[];
ll calc(int pos,int v,int l,int r,int k)
{
int L=,R=s[k],mid,ans=1e9;
while(L<=R)
{
mid=L+R>>;
if(a[q[mid][k]][k]==v) {ans=mid;break;}
if(a[q[mid][k]][k]>v) L=mid+;
else R=mid-;
}
if(ans==1e9) return ;
return 1ll*max(min(pos,q[ans][k])-max(l,q[ans-][k]+)+,)*(r-max(pos,q[ans][k])+);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i) scanf("%d",&a[i][]);
for(int i=;i<=n;++i) scanf("%d",&a[i][]);
s[]=s[]=q[][]=q[][]=;
for(int i=;i<=n;++i)
for(int j=;j<;++j)
{
while(s[j]&&a[q[s[j]][j]][j]<=a[i][j]) ans+=calc(q[s[j]][j],a[q[s[j]][j]][j],q[s[j]-][j]+,i-,j^),s[j]--;
q[++s[j]][j]=i;
}
for(int i=;i<=s[];i++) ans+=calc(q[i][],a[q[i][]][],q[i-][]+,n,);
printf("%lld\n",ans);
}
最新文章
- charset的获取方法
- 解决eclipse中android添加重载函数时参数为arg0,arg1的问题
- 前端代理nproxy
- Android手动画柱状图的例子
- ASP.NET、WinForm、C# - 配置文件信息读取 [ Web.config || Appconfig ]
- 惊人go语言(image网站开发)
- 一起学习android使用一个回调函数onCreateDialog实现负载对话(23)
- chd校内选拔赛题目+题解
- Variational Bayes
- JavaScript入门学习笔记(JSON)
- div 隐藏显示各种例子
- 隐藏Nginx或Apache以及PHP的版本号的方法
- POJ 3579 Median 【二分答案】
- [ERROR] - Error reading string. Unexpected token: StartObject. Path &#39;formData&#39;, line 1, position 13.
- go语言常见问题总结
- PHP的session的实现机制
- trac
- zTree分批异步加载方式下实现节点搜索功能(转载)
- s5-15 开放的最短路径优先_OSPF
- 【代码笔记】iOS-计算时间差
热门文章
- 【LibreOJ】#6257. 「CodePlus 2017 12 月赛」可做题2
- JavaScript中innerText和innerHTML的区别
- mongoose使用简记
- Tinyos Makerules解读
- linux 查看内存和cpu占用比较多的进程
- java中的matches ->; 完全匹配
- 日常开发技巧:x11-forward,使用远程机器的gui程序
- Photon3Unity3D.dll 解析一
- leetcode 之Search in Rotated Sorted Array(四)
- 关于IdByName 为什么一个消息主题要有 Id和 Name的解释