CodeForces 602D 【单调队列】【简单数学】
题意:
给你n个数,m次询问,每次询问给l和r代表l和r中间所有子区间中特征值的和。
特征值的定义是在这个区间中找i和j使得|tmp[i]-tmp[j]|/|j-i|最大。
思路:
首先是特征值的定义,这个东西其实是斜率~不知道从哪里看到的证明,这个只有相邻的点才可能最大。所以给定区间找到最大值其实是在相邻的中找。这是这题第一个关键点。
如果一个一个加寻找每一个区间那么复杂度应该是n^2,这里的n大小是1e5,还是不行。然后这个时候思路就是通过单调队列来解决啦~【个人认为更像是个DP】找到某个点左边和右边能扩展的最大覆盖值~然后我们可以计算出从左边到右边对于这个点他本身能分离出来的子区间的数量。【就是个简单的组合问题,从左边中选一个起点从右边选一个终点】,然后用子区间的数量乘上该点(不应该说成点,应该是相邻两个点之间的斜率)。屌丝一开始在这里被坑了...加入某两个值相等了怎么办...这个地方是坑点,不能重复也不能缺漏...当相同的时候只向左边扩展或者只向右边扩展...因为计算的时候我们每个点都是要进行计算的,如果同时扩展范围肯定会重复,如果都不扩展那么会丢失包含两个相同最大值的子区间。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100500
using namespace std;
int n,m;
int tmp[N];
int ttmp[N];
int l[N],r[N];
int main()
{
int s,e;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&tmp[i]);
}
for(int i=;i<n;i++)
{
ttmp[i]=max(tmp[i],tmp[i+])-min(tmp[i],tmp[i+]);
}
/*for(int i=1;i<=n;i++)
{
printf("%d ",ttmp[i]);
}
puts("");*/
for(int i=;i<n;i++)
{
l[i]=;
for(int j=i-;j>=;)
{
if(ttmp[i]>ttmp[j])
{
l[i]+=l[j];
j-=l[j];
}
else
{
break;
}
}
}
/*for(int i=1;i<n;i++)
{
printf("%d ",l[i]);
}
puts("");*/
for(int i=n-;i>=;i--)
{
r[i]=;
for(int j=i+;j<n;)
{
if(ttmp[i]>=ttmp[j])
{
r[i]+=r[j];
j+=r[j];
}
else
{
break;
}
}
}
/*for(int i=1;i<n;i++)
{
printf("%d ",r[i]);
}
puts("");*/
long long ans;
for(int i=;i<=m;i++)
{
ans=;
scanf("%d%d",&s,&e);
for(int j=s;j<e;j++)
{
long long ll=min(j-s+,l[j]);
long long rr=min(e-j,r[j]);
ans+=(ll*rr*ttmp[j]);
}
printf("%I64d\n",ans);
}
}
CodeForces 602D 【单调队列】【简单数学】的更多相关文章
- Strip CodeForces - 487B (单调队列)
题面: Alexandra has a paper strip with n numbers on it. Let's call them ai from left to right. Now Ale ...
- CodeForces - 91B单调队列
有一个数列,对于每一个数,求比它小的在他右边距离他最远的那个数和他的距离 用单调队列做,维护单调队列时可采用如下方法,对于每一个数,如果队列中没有数,则加入队列,如果队列头的数比当前数大,则舍弃该数 ...
- Codeforces 665D Simple Subset [简单数学]
题意: 给你n个数,让你从中选一个子集要求子集中的任何两个数相加都是质数. 思路: 一开始把自己坑了,各种想,后来发现一个简单的性质,那就是两个数相加的必要条件是这两个数之中必定一个奇数一个偶数,(除 ...
- poj2823_单调队列简单入门
题目链接:http://poj.org/problem?id=2823 #include<iostream> #include<cstdio> #define M 100000 ...
- codeforces 939F 单调队列优化dp
F. Cutlet time limit per test 4 seconds memory limit per test 256 megabytes input standard input out ...
- hdu 3706 Second My Problem First 单调队列
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 M ...
- [DP浅析]线性DP初步 - 2 - 单调队列优化
目录 #0.0 前置知识 #1.0 简单介绍 #1.1 本质 & 适用范围 #1.2 适用方程 & 条件 #2.0 例题讲解 #2.1 P3572 [POI2014]PTA-Littl ...
- CodeForces 164 B. Ancient Berland Hieroglyphs 单调队列
B. Ancient Berland Hieroglyphs 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co ...
- Codeforces Round #189 (Div. 1) B. Psychos in a Line 单调队列
B. Psychos in a Line Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/p ...
随机推荐
- python之路 之open
一.open:文件打开操作 文件句柄 = open('文件路径','读写模式') 打开文件的模式有: r:只读,默认(文件不存在则报错) w:只写(文件不存在则自动创建) a:追加(文件不存在则自动创 ...
- Visual Studio个人常用快捷键
Ctrl+F5:运行程序 F9:设置/取消断点 F5:启动调试 F10:逐过程单步调试 F11:逐语句单步调试 按住Ctrl先按K再按D:格式化全部代码 按住Ctrl先按K再按F:将选中代码块格式化 ...
- Android 检测网络连接状态
Android连接网络的时候,并不是每次都能连接到网络,因此在程序启动中需要对网络的状态进行判断,如果没有网络则提醒用户进行设置. 首先,要判断网络状态,需要有相应的权限,下面为权限代码(Androi ...
- Android Intent 用法全面总结
[代码全屏查看]-Android Intent 用法全面总结 // [1].[代码] 调用拨号程序 跳至 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] / ...
- [转]利于ThreadLocal管理Hibernate Session
摘自http://aladdin.iteye.com/blog/40986 在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Sessi ...
- 剑指offer系列30-----删除链表中重复的节点
[题目]在一个排序的链表中,存在重复的结点, * 请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. * 例如,链表1->2->3->3->4->4->5 ...
- 【转】Dubbo是Alibaba开源的分布式服务框架
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ...
- 51nod 1297 管理二叉树
一个初始为空的二叉搜索树T,以及1到N的一个排列P: {a1, a2, ..., aN}.我们向这个二叉搜索树T添加这些数,从a1开始, 接下来是 a2, ..., 以aN结束.在每一个添加操作后,输 ...
- Saltstack系列3:Saltstack常用模块及API
说明 salt '*' sys.list_modules #列出当前版本支持的模块 API原理是通过调用master client模块,实例化一个LocalClient对象,再调用cmd()方法来实现 ...
- c++封装编写线程池
在csapp学习或者其他linux底层编程的过程中,一般都会举一些多线程或多进程的例子,配合底层同步原语.系统调用api来解释怎么创建多线程/多进程. 但是这些例子和实际项目中所用到的多线程/多进程编 ...