T2count题解

【 问题描述】:

小 A 是一名热衷于优化各种算法的 OIER,有一天他给了你一个随机生成的 1~n 的排列, 并定 义区间[l,r]的价值为:

\[\huge C_{l,r}=\max(a_i-a_j|l \le i,j \le r )
\]

他想请你告诉他, 所有区间的价值的总和为多少

【 输入】

第一行一个数 T(<=10), 表示数据组数 对于每一组数据: 第一行一个数 n( 1<=n,m<=100,000) 第二行 n 个数 a1...an, 表示一个 1~n 的随机的排列

【 输出】

对于每组数据输出一个数, 表示答案

【 输入样例】

1
4
3 2 4 1

【 输出样例】

14

【 数据范围】

对于 60%的数据: n<=1000

对于 100%的数据, n<=100,000

我们先看普通的暴力:

让\(mi[l][r]\)表示从\(l\)到\(r\)区间的最小值

让\(mx[l][r]\)表示从\(l\)到\(r\)区间的最大值

则答案为:

\[\large \sum_{l=1}^{n}\sum_{r=l}^{n}(mx[l][r]-mi[l][r])
\]

但是仔细观察式子我们可以发现:

\[\sum_{l=1}^{n}\sum_{r=l}^{n}(mx[l][r]-mi[l][r])=\sum_{l=1}^{n}\sum_{r=l}^{n}mx[l][r]-\sum_{l=1}^{n}\sum_{r=l}^{n}mi[l][r]
\]

然后mx和mi的部分我们可以单独求

所以以最大值为例子

一个点可以管辖的范围为左边第一个比他大的点到右边第一个比他大的点

我们设\(l[i]\)为左边第一个比\(a[i]\)大的位置\(r[i]\)为右边第一个比\(a[i]\)大的位置

则只要满足\(l[i]<x\le i\)并且\(i\le y <r[i]\)的所有区间\([x,y]\)的最小大值都为i

所以这一部分区间我们把它乘起来

然后所有区间最大值的和为

\[\large \sum_{i=1}^{n}(r[i]-i)\times(i-l[i])\times a[i]
\]

最小值同理

然后求靠左/右的第一个比他大/小的数就可以用单调栈来解决

最后把最大值的和和最小值的和相减就是答案

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define int long long
#define clear(x) memset(x,0,sizeof x)
const int maxn=1e5+5;
int read(){
int s=0,f=1;char ch;
while(!isdigit(ch=getchar()))(ch=='-')&&(f=-1);
for(s=ch-'0';isdigit(ch=getchar());s=s*10+ch-'0');
return s*f;
}
int a[maxn];
int s1[maxn],t1;
int l[maxn],r[maxn];
int n;
int ans=0;
inline void clearlr(){for(int i=1;i<=n;++i){l[i]=0;r[i]=n+1;}}
signed main(){
#ifndef nFILE
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
#endif
int T=read();
while(T--){
ans=0;
n=read();
clear(a);
for(int i=1;i<=n;++i){(a[i]=read());}
clear(s1);t1=0;
clearlr();
for(int i=1;i<=n;++i){
while(t1&&a[s1[t1]]<a[i])r[s1[t1--]]=i;
s1[++t1]=i;
}
clear(s1);t1=0;
for(int i=n;i;--i){
while(t1&&a[s1[t1]]<a[i])l[s1[t1--]]=i;
s1[++t1]=i;
}
for(int i=1;i<=n;++i){ans+=(r[i]-i)*(i-l[i])*a[i];}
clear(s1);t1=0;
clearlr();
for(int i=1;i<=n;++i){
while(t1&&a[s1[t1]]>a[i])r[s1[t1--]]=i;
s1[++t1]=i;
}
clear(s1);t1=0;
for(int i=n;i;--i){
while(t1&&a[s1[t1]]>a[i])l[s1[t1--]]=i;
s1[++t1]=i;
}
for(int i=1;i<=n;++i){ans-=(r[i]-i)*(i-l[i])*a[i];}
cout<<ans<<endl;
}
return 0;
}

noip提高组模拟赛(QBXT)T2的更多相关文章

  1. 10-18 noip提高组模拟赛(codecomb)T2贪心

    T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...

  2. 计蒜客 2017 NOIP 提高组模拟赛(四)Day1 T2 小X的密室

    https://nanti.jisuanke.com/t/17323 小 X 正困在一个密室里,他希望尽快逃出密室. 密室中有 N 个房间,初始时,小 X 在 1号房间,而出口在 N号房间. 密室的每 ...

  3. 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]

    T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...

  4. [LUOGU] NOIP提高组模拟赛Day1

    题外话:以Ingress为题材出的比赛好评,绿军好评 T1 考虑枚举第\(i\)个人作为左边必选的一个人,那左边剩余\(i-1\)个人,选法就是\(2^{i-1}\),也就是可以任意选或不选,右侧剩余 ...

  5. l洛谷 NOIP提高组模拟赛 Day2

    传送门 ## T1 区间修改+单点查询.差分树状数组. #include<iostream> #include<cstdio> #include<cstring> ...

  6. HGOI2010816 (NOIP 提高组模拟赛 day1)

    Day1 210pts(含T1莫名的-10pts和T3莫名的-30pts) 100+70+40=210 rank 29 这道题第一眼看是字符串匹配问题什么KMP啊,又想KMP不会做啊,那就RK Has ...

  7. HGOI20180815 (NOIP 提高组模拟赛 day2)

    Day 2 rank 11 100+35+30=165 本题是一道数论题,求ax+by=c的正整数对(x,y) x>=0并且y>=0 先说下gcd: 求a,b公约数gcd(a,b) 如gc ...

  8. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

  9. 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】

    U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...

随机推荐

  1. _LightColor0将会是主要的directional light的颜色。

    LightMode是个非常重要的选项,因为它将决定该pass中光源的各变量的值.如果一个pass没有指定任何LightMode tag,那么我们就会得到上一个对象残留下来的光照值,这并不是我们想要的. ...

  2. c++ 备忘录模式(memento)

    备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态[DP].举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的 ...

  3. Docker03 Docker基础知识、Docker实战

    1 Docker基础知识 1.1 什么是Docker Docker是一个可以装应用的容器,就像杯子可以装水.书包可以装书一样:docker官网 Docker是Docker公司开发的,并开源到GitHu ...

  4. CloudFoundry 快速上手笔记

    1.登陆cf 2.登陆进入webservice 3.查看ruby版本 4.查看gem版本 5.安装CF 6.配置cf Download the CLI from github: https://git ...

  5. linux操作系统下,怎么使用kill按照PID一次杀死多个进程

    1.ps -ef | grep firefox | grep -v grep | cut -c 9-15 | xargs kill -s 9 说明:“grep firefox”的输出结果是,所有含有关 ...

  6. networkX用法整

    无向图,有向图,加权图等例子代码 [http://www.cnblogs.com/kaituorensheng/p/5423131.html#_label1] 数据分析学习笔记(三)-NetworkX ...

  7. HBase列族高级配置

    转自:http://blog.sina.com.cn/s/blog_ae33b83901018euz.html ------------------ HBase有几个高级特性,在你设计表时可以使用.这 ...

  8. Sql的行列转换

    创建表scores 一.传统的行列转换 纵表转横表 我们要转成的横表是这样子的: pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用.主要用于行和列的转 ...

  9. 给初学者的总结:jquery选择器

    刚学jquery的时候是又渣又蠢的小白,而且把js和jquery混淆在一起. 把jquery的全部选择器总结在一起,才发现和css选择器好一部分都很像,并且有些选择器还很少用过. 我学习前端的路程是先 ...

  10. Python 2.6 安装wxPython后提示"64.....32"错误解决办法

    ImportError: /usr/local/lib/wxPython-unicode-2.8.10.1/lib/python2.6/site-packages/wx-2.8-mac-unicode ...