博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51nod 1962 区间计数(单调栈+二分)
阅读量:5362 次
发布时间:2019-06-15

本文共 1432 字,大约阅读时间需要 4 分钟。

  维护两个单调递减的栈,当i加进栈,位置x的数弹出的时候,在另一个栈中找到和这个数一样大的数,计算贡献(x-靠右左端点)*(i-x)。

#include
#include
#include
#include
#include
#define ll long long using namespace std;const int maxn=500010,inf=1e9;int n,m,x,y,z,tot,topa,topb;int a[maxn],b[maxn],sta[maxn],stb[maxn];ll ans;void read(int &k){ int f=1;k=0;char c=getchar(); while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar(); k*=f;}int main(){ read(n); for(int i=1;i<=n;i++)read(a[i]); for(int i=1;i<=n;i++)read(b[i]); a[++n]=inf;b[n]=inf-1; for(int i=1;i<=n;i++) { for(;topa&&a[sta[topa]]<=a[i];topa--) { if(!topb)continue; int l=1,r=topb; while(l
>1; if(b[stb[mid]]<=a[sta[topa]])r=mid; else l=mid+1; } int x=l;if(b[stb[x]]!=a[sta[topa]])continue; ans+=1ll*max(0,min(stb[x],sta[topa])-max(stb[x-1],sta[topa-1]))*(i-max(stb[x],sta[topa])); } for(;topb&&b[stb[topb]]<=b[i];topb--) { if(!topa)continue; int l=1,r=topa; while(l
>1; if(a[sta[mid]]<=b[stb[topb]])r=mid; else l=mid+1; } int x=l;if(a[sta[x]]!=b[stb[topb]])continue; ans+=1ll*max(0,min(sta[x],stb[topb])-max(sta[x-1],stb[topb-1]))*(i-max(sta[x],stb[topb])); } sta[++topa]=stb[++topb]=i; } printf("%lld\n",ans); return 0;}
View Code

 

转载于:https://www.cnblogs.com/Sakits/p/7581404.html

你可能感兴趣的文章
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>
前端笔记-bom
查看>>
上海淮海中路上苹果旗舰店门口欲砸一台IMAC电脑维权
查看>>
Google透露Android Market恶意程序扫描服务
查看>>
给mysql数据库字段值拼接前缀或后缀。 concat()函数
查看>>
迷宫问题
查看>>
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
泛型子类_属性类型_重写方法类型
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
Code Snippet
查看>>
zoj 1232 Adventure of Super Mario
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
Redis常用命令
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
Week03-面向对象入门
查看>>