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. Openssl rand命令

    一.简介 rand命令用来产生伪随机字节,随机数字产生器需要一个seed,在没有/dev/srandom系统下的解决方法是自己做一个~/.rnd文件 二.语法 openssl rand [-out f ...

  2. if-return 语句

    if(A > B): return A+1 return A-1 or if(A > B): return A+1 else: return A-1 +++++++++++++++++++ ...

  3. SourceTree 3.0.8 跳过登陆注册

    3.0.8普通用户版account.json跳过登陆注册方法已失效,请安装企业版 https://www.sourcetreeapp.com/enterprise 企业版默认安装在 %programf ...

  4. iOS基础教程:在建好的项目中加入CoreData[转]

    这几天在做一个ios的小项目,项目中需要对数据进行基本的增删改查操作.于是就想用一把CoreData.但在创建项目初期,没有包含进CoreData.于是就在已建好的项目中加入CoreData.由于第一 ...

  5. ADF文件数据结构解析和ADF文件读写

    包括位姿和特征点位置和描述信息. What does an Area Description File (ADF) looks like? 4down votefavorite 2 I'm start ...

  6. Opengl中的GLUT下的回调函数

    void glutDisplayFunc(void (*func)(void)); 注册当前窗口的显示回调函数 参数: func:形为void func()的函数,完成具体的绘制操作 这个函数告诉GL ...

  7. Java网络编程のTCP/IP

    TCP/IP参考模型和TCP/IP协议 与OSI参考模型相似,TCP/IP参考模型汲取了网络分层的思想,而且对网络的层次做了简化,并在网络各层都提供了完善的协议,这些协议构成了TCP/IP协议集,简称 ...

  8. [Mac][转] ports命令

    [Mac][转] ports命令 安装路径:/opt/local/lib/ 常用命令 port -d selfupdate #升级macport, 如同:cd /usr/ports && ...

  9. js和C# 时间日期格式转换

    下午在搞MVC和EXTJS的日期格式互相转换遇到了问题,我们从.NET服务器端序列化一个DateTime对象的结果是一个字符串格式,如 '/Date(1335258540000)/' 这样的字串. 整 ...

  10. centos 安装erlang rpm包互相依赖问题

    在项目中使用 centos 6.5 mini 版本(网络隔离,无法上外网),因测试需要使用到 erlang 环境. erlang rpm 包下载地址:https://www.erlang-soluti ...