[Tyvj P4875]排列
来源:互联网 发布:依伊芭莎淘宝 编辑:程序博客网 时间:2024/06/05 16:56
原题链接
一开始想的是n2做法
预处理+n2枚举
然后看了题解
利用单调栈
固定左端点
右端点跳到最大最小值发生改变的地方
时间复杂度nlogn
#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>#include<vector>#include<climits>#include<string>#include<cstdlib>#include<ctime>#define MOD 1000000007#define LL long longusing namespace std;LL t,n,a[100005],rmax[100005],rmin[100005],top,q[100005],maxn,minn,j,j1,j2,d,ans[100005];void pre(){ LL i; q[0]=n+1; top=0; for(i=n;i>=1;i--) { while(top&&a[q[top]]<=a[i]) top--; rmax[i]=q[top]; top++; q[top]=i; } q[0]=n+1; top=0; for(i=n;i>=1;i--) { while(top&&a[q[top]]>=a[i]) top--; rmin[i]=q[top]; top++; q[top]=i; }}int main(){ LL i; scanf("%lld",&t); while(t--) { memset(ans,0,sizeof(ans)); scanf("%lld",&n); for(i=1;i<=n;i++) scanf("%lld",&a[i]); pre(); for(i=1;i<=n;i++) { j=i; j1=i; j2=i; while(j<=n) { if(rmax[j1]<rmin[j2]) { d=rmax[j1]-j; ans[a[j1]-a[j2]]+=d; j=rmax[j1]; j1=rmax[j1]; } else { d=rmin[j2]-j; ans[a[j1]-a[j2]]+=d; j=rmin[j2]; j2=rmin[j2]; } } } for(i=1;i<n;i++) ans[i]+=ans[i-1]; for(i=0;i<n;i++) printf("%lld\n",ans[i]); } return 0;}
阅读全文
0 0
- [Tyvj P4875]排列
- Tyvj P4876 近似排列计数
- Tyvj p1336 火车进站 搜索//全排列
- [Tyvj P4876]近似排列计数[50]
- TYVJ
- TYVJ P1005
- TYVJ 01034
- tyvj-1027
- tyvj 1004
- Tyvj 1125
- TYVJ P1333
- TYVJ P1696
- TYVJ 1013
- TYVJ P1002
- tyvj 跑路
- tyvj 笔记本电脑
- TYVJ 1982
- tyvj 1288
- h5ai v0.29中文文件名、文件、url乱码解决方法
- 给定整数数组,除了一个元素之外,每个元素都出现三次。 找到那个只出现一次的数
- C++一本通题库1005
- 存储过程浅述
- Interspeech 2017论文总结
- [Tyvj P4875]排列
- lecture4,backpropagation and nerual network
- Java编程思想读书笔记——接口
- 如何让ie8及之前的浏览器兼容HTML5新标签和自己设定的新标签
- HDOJ题目分类
- 手动创建活动之学习笔记
- 集合的实现2--使用数组
- mybatis源码环境搭建(写于2015-06-14 13:16:45)
- Spring内部方法新起一个事务,此处应有坑。