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. Opencv Convex Hull (凸包)

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  2. Maven面试宝典啊

    一.Maven有哪些优点和缺点 优点如下: 简化了项目构建.依赖管理: 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作 便于与持续集成工具( ...

  3. VisualVM远程连接Tomcat(转)

    转自:http://www.cnblogs.com/sunshine-2015/p/5547128.html VisualVM VisualVm是一个将很多JDK命令工具可视化的windows程序,直 ...

  4. JSON_UNESCAPED_UNICODE

    JSON_UNESCAPED_UNICODE(中文不转为unicode)

  5. Golang 之 Base62 编码

    Base62 编码用62个可见字符来编码信息,也就是所谓的62进制,可用于缩短地址之类的.实现起来也很简单.当然,这个实现跟别人家的有可能不一样,反正自己能编能解就行. package main im ...

  6. OSG图形设备接口GraphicsContext

    1.图形设备与相机 在Camera类的成员函数中,setGraphicContext()函数的工作是设置相机对应的图形设备对象,换句话说,下面要介绍的GraphicsContext类就是图形设备对象的 ...

  7. ThinkPhp 生成静态页面

    //开启静态缓存'HTML_CACHE_ON' => true, //开启缓存'HTML_CACHE_TIME' =>60, //开启缓存时间'HTML_FILE_SUFFIX' => ...

  8. Generated by NetworkManager、ubuntu DNS设置丢失(network-manager造成的情况)

    方法一:去掉重启 方法二:卸载network-manager 实测网络不稳,经常掉线(kalinux2.0环境)

  9. ScreenCapture-drupal 7.34-ckeditor4x整合教程

    1.1. drupal 7x-ckeditor4x 插件下载:Drupal 7x, 1.1.1. 安装ckeditor4x 下载插件 说明:下载并解压 CKEditor4x插件:https://yun ...

  10. 查看HDFS集群信息

    clusterID:集群ID,必须保持一致 1)在NameNode上查看 cat $HADOOP_HOME/dfs/name/current/VERSION #Fri Apr 18 11:56:57 ...