题意:

给你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 【单调队列】【简单数学】的更多相关文章

  1. Strip CodeForces - 487B (单调队列)

    题面: Alexandra has a paper strip with n numbers on it. Let's call them ai from left to right. Now Ale ...

  2. CodeForces - 91B单调队列

    有一个数列,对于每一个数,求比它小的在他右边距离他最远的那个数和他的距离 用单调队列做,维护单调队列时可采用如下方法,对于每一个数,如果队列中没有数,则加入队列,如果队列头的数比当前数大,则舍弃该数 ...

  3. Codeforces 665D Simple Subset [简单数学]

    题意: 给你n个数,让你从中选一个子集要求子集中的任何两个数相加都是质数. 思路: 一开始把自己坑了,各种想,后来发现一个简单的性质,那就是两个数相加的必要条件是这两个数之中必定一个奇数一个偶数,(除 ...

  4. poj2823_单调队列简单入门

    题目链接:http://poj.org/problem?id=2823 #include<iostream> #include<cstdio> #define M 100000 ...

  5. codeforces 939F 单调队列优化dp

    F. Cutlet time limit per test 4 seconds memory limit per test 256 megabytes input standard input out ...

  6. hdu 3706 Second My Problem First 单调队列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 M ...

  7. [DP浅析]线性DP初步 - 2 - 单调队列优化

    目录 #0.0 前置知识 #1.0 简单介绍 #1.1 本质 & 适用范围 #1.2 适用方程 & 条件 #2.0 例题讲解 #2.1 P3572 [POI2014]PTA-Littl ...

  8. CodeForces 164 B. Ancient Berland Hieroglyphs 单调队列

    B. Ancient Berland Hieroglyphs 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co ...

  9. 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 ...

随机推荐

  1. 【转】使用itms-services从浏览器发布iOS App遇到的问题总结

    itms-service是apple为iOS企业用户($299)提供的无线分发安装方式所使用的协议,使用这种方式发布应用不需要通过App Store,任何iOS设备都可以安装企业用户通过这种方式发布的 ...

  2. list如何remove 特别容易出错

    java中对list进行操作很频繁,特别是进行list启遍历,这些操作我们都会,也很熟悉,但是对java中list进行删除元素,remove list中的元素就不怎么熟悉了吧,可以说很陌生,是实际操作 ...

  3. 使用bind(this)的情况

    1.setInterval().setTimeout()的回调函数,一定要加.bind(this)方法. 原因是:在setInterval()中定义的回调函数,是在同步代码执行完后,随着事件触发来异步 ...

  4. 图解SQL的各种连接join[转]

    对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...

  5. 【jmeter】ANT批量执行Jmeter脚本

    一.环境准备: 1.Jdk1.6或以上:命令行输入:java -version,出现如下提示说明安装成功 2.ANT下载:http://ant.apache.org/bindownload.cgi 命 ...

  6. IntelliJ IDEA使用SSH功能

    Tools→Start SSH session... 选择Edit credentials... 输入SSH登录信息即可 输入SSH登录信息,Port默认为22 来自为知笔记(Wiz)

  7. bzoj3163: [Heoi2013]Eden的新背包问题

    Description “寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听.”失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的感觉,却不能回忆起她 ...

  8. jquery form表单序列号

    1.serialize()方法 格式:var data = $("form").serialize(); 功能:将表单内容序列化成一个字符串. 这样在ajax提交表单数据时,就不用 ...

  9. TMS320C54x系列DSP的CPU与外设——第2章 TMS320C54x DSP体系结构总体介绍

    第2章 TMS320C54x DSP体系结构总体介绍 本章介绍TMS320C54x DSP体系结构的概况,包括中央处理单元(CPU).存在器和片内外设. C54x DSP采用了高级的改进哈佛结构,用8 ...

  10. 在Java中使用Memcached(转)

    memcache的Java客户端调用,在网上还是有些少,很多都是php的.如何要想用Java调用memcache的服务,首先要有客户端的支持,我们先下载一个客户端吧.下载地址:https://gith ...