显然问题即求$\frac{\sum_{x\le l\le r\le y}(\max_{l\le i\le r}a_{i}+\min_{l\le i\le r}a_{i})}{(y-x+2)(y-x+1)}$

分母显然是常数,分子中$\max$​和$\min$​是类似地,不妨仅考虑$\sum_{x\le l\le r\le y}\max_{l\le i\le r}a_{i}$

将询问离线,不断增大右端点$r$​,并维护$ans_{i}=\sum_{r'=i}^{r}\max_{i\le j\le r'}a_{j}$​​,那么即对$ans_{i}$​​区间求和

将$ans_{i}$​​​写作$r\cdot max_{i}-sum_{i}$​​​的形式(其中$max_{i}=\max_{i\le j\le r}a_{j}$​),显然可以对两者分别求和​​

下面,考虑从$r-1$​变为$r$​对$(max_{i},sum_{i})$​的影响:

维护一个单调栈(从栈底到栈顶单调递减),假设弹出栈顶元素$x$​​​​​​​,且下一个元素为$y$​​​​​​(若栈为空则$y=0$​​​​​),那么即对区间$(y,x]$​​​​的$max_{i}$​​​​增加$a_{r}-a_{x}$​​​​,$sum_{i}$​​​​增加$(r-1)(a_{r}-a_{x})$​​​​

另外还要维护$r$​​​​​​的答案,即令$(max_{r},sum_{r})=(a_{r},(r-1)a_{r})$​​​​​​

即要支持区间加和区间查询,使用线段树即可,复杂度为$o(n\log n)$​,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define mod 1000000007
5 #define ll long long
6 #define pii pair<int,int>
7 #define mp make_pair
8 #define fi first
9 #define se second
10 #define L (k<<1)
11 #define R (L+1)
12 #define mid (l+r>>1)
13 struct Data{
14 int l,r,id;
15 bool operator < (const Data &k)const{
16 return r<k.r;
17 }
18 }q[N];
19 int t,n,m,inv[N],a[N],mn[N],mx[N],ans[N];
20 pii tag[N<<2],f[N<<2];
21 pii merge(pii x,pii y){
22 return mp((x.fi+y.fi)%mod,(x.se+y.se)%mod);
23 }
24 void upd(int k,int l,int r,pii o){
25 int len=r-l+1;
26 tag[k]=merge(tag[k],o);
27 f[k]=merge(f[k],mp((ll)len*o.fi%mod,(ll)len*o.se%mod));
28 }
29 void down(int k,int l,int r){
30 upd(L,l,mid,tag[k]);
31 upd(R,mid+1,r,tag[k]);
32 tag[k]=mp(0,0);
33 }
34 void build(int k,int l,int r){
35 f[k]=mp(0,0);
36 if (l==r)return;
37 build(L,l,mid);
38 build(R,mid+1,r);
39 }
40 void update(int k,int l,int r,int x,int y,pii z){
41 if ((l>y)||(x>r))return;
42 if ((x<=l)&&(r<=y)){
43 upd(k,l,r,z);
44 return;
45 }
46 down(k,l,r);
47 update(L,l,mid,x,y,z);
48 update(R,mid+1,r,x,y,z);
49 f[k]=merge(f[L],f[R]);
50 }
51 pii query(int k,int l,int r,int x,int y){
52 if ((l>y)||(x>r))return mp(0,0);
53 if ((x<=l)&&(r<=y))return f[k];
54 down(k,l,r);
55 return merge(query(L,l,mid,x,y),query(R,mid+1,r,x,y));
56 }
57 int main(){
58 inv[0]=inv[1]=1;
59 for(int i=2;i<N;i++)inv[i]=(ll)(mod-mod/i)*inv[mod%i]%mod;
60 scanf("%d",&t);
61 while (t--){
62 scanf("%d%d",&n,&m);
63 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
64 for(int i=1;i<=m;i++){
65 scanf("%d%d",&q[i].l,&q[i].r);
66 q[i].id=i;
67 }
68 sort(q+1,q+m+1);
69 mn[0]=mx[0]=0;
70 memset(tag,0,sizeof(tag));
71 memset(f,0,sizeof(f));
72 for(int i=1,j=1;i<=n;i++){
73 update(1,1,n,i,i,mp(2*a[i]%mod,(ll)2*(i-1)*a[i]%mod));
74 while ((mx[0])&&(a[mx[mx[0]]]<a[i])){
75 int x=mx[mx[0]],y=mx[--mx[0]];
76 update(1,1,n,y+1,x,mp((a[i]-a[x]+mod)%mod,(ll)(i-1)*(a[i]-a[x]+mod)%mod));
77 }
78 while ((mn[0])&&(a[mn[mn[0]]]>a[i])){
79 int x=mn[mn[0]],y=mn[--mn[0]];
80 update(1,1,n,y+1,x,mp((a[i]-a[x]+mod)%mod,(ll)(i-1)*(a[i]-a[x]+mod)%mod));
81 }
82 mx[++mx[0]]=mn[++mn[0]]=i;
83 while ((j<=m)&&(q[j].r==i)){
84 pii o=query(1,1,n,q[j].l,i);
85 ans[q[j].id]=((ll)i*o.fi-o.se+mod)%mod*inv[i-q[j].l+2]%mod*inv[i-q[j].l+1]%mod;
86 j++;
87 }
88 }
89 for(int i=1;i<=m;i++)printf("%d\n",ans[i]);
90 }
91 return 0;
92 }

[hdu6989]Didn't I Say to Make My Abilities Average in the Next Life?!的更多相关文章

  1. mysql每秒最多能插入多少条数据 ? 死磕性能压测

    前段时间搞优化,最后瓶颈发现都在数据库单点上. 问DBA,给我的写入答案是在1W(机械硬盘)左右. 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高(SSD硬盘) 但这东西感 ...

  2. ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入

    原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...

  3. python核心编程第二版练习题答案

    2-5 #写一个while循环,输出整型为0~10 a=0while a<11: print a a+=1 #写一个for循环重复以上操作 for i in range(11): print i ...

  4. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  5. Vue.js 2.0 和 React、Augular等其他框架的全方位对比

    引言 这个页面无疑是最难编写的,但也是非常重要的.或许你遇到了一些问题并且先前用其他的框架解决了.来这里的目的是看看Vue是否有更好的解决方案.那么你就来对了. 客观来说,作为核心团队成员,显然我们会 ...

  6. python程序生成平均脸

    简介 项目代码https://github.com/LiuRoy/pokerface 原文链接http://www.cnblogs.com/lrysjtu/p/5492547.html 写这个项目的本 ...

  7. [C#] 走进 LINQ 的世界

    走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...

  8. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  9. 高频交易算法研发心得--MACD指标算法及应用

    凤鸾宝帐景非常,尽是泥金巧样妆. 曲曲远山飞翠色:翩翩舞袖映霞裳. 梨花带雨争娇艳:芍药笼烟骋媚妆. 但得妖娆能举动,取回长乐侍君王. [摘自<封神演义>纣王在女娲宫上香时题的诗] 一首定 ...

随机推荐

  1. Mysql读写分离集群的搭建且与MyCat进行整合

    1. 概述 老话说的好:不熟悉的东西不要不懂装懂,做人要坦诚,知道就是知道,不知道就是不知道. 言归正传,今天我们来聊聊 Mysql主从读写分离集群是如何搭建的,并且聊一下如何用 MyCat 去访问这 ...

  2. 题解「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set

    题目传送门 题目大意 给出一个长度为 \(n\) 的数组,选出一些数异或之和为 \(s1\),其余数异或之和为 \(s2\),求 \(s1+s2\) 最大时 \(s1\) 的最小值. 思路 你发现如果 ...

  3. 洛谷3288 SCOI2014方伯伯运椰子(分数规划+spfa)

    纪念博客又一次爆炸了 首先,对于本题中,我们可以发现,保证存在正整数解,就表示一定费用会降低.又因为一旦加大的流量,费用一定会变大,所以总流量一定是不变的 那么我们这时候就需要考虑一个退流的过程 对于 ...

  4. pycharm中设置自己的文件模板

    File>>Settings>>Editor>>File and Code Templates 选择文件类型Python Scripts,输入文件模板类型 #!/u ...

  5. struts2漏洞复现分析合集

    struts2漏洞复现合集 环境准备 tomcat安装 漏洞代码取自vulhub,使用idea进行远程调试 struts2远程调试 catalina.bat jpda start 开启debug模式, ...

  6. 【Takin使用日记】记一次TransmittableThreadLocal引起的业务异常

    对于常见的 WEB 容器,Takin 通过增强 org.apache.catalina.core.StandardHostValve#invoke 方法,拦截并解析方法入参的 Request 对象中的 ...

  7. 2021.9.28考试总结[NOIP模拟64]

    T1 三元组 发现确定\(b,c\)的情况下,\(a\)的值域是连续的.确定\(b\)后\(a+b\)的取值是\([1+b,b+b]\).树状数组维护对每个\(b\)可行的\(c\). 注意取模后取值 ...

  8. 镜头Lens Image circle像圈的解释是什么意思

    Image circle镜头中指的是:像圈 像圈(image circle)是指入射光线通过镜头后,在焦平面上呈现出的圆形的明亮清晰的影像幅面,也称像面大小.镜头像圈由镜头光学结构决定,一旦设计完成, ...

  9. 零基础小白要如何跟好的学习嵌入式Linux(转)

    作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学 ...

  10. 访问单个结点的删除 牛客网 程序员面试金典 C++ Python

    访问单个结点的删除 牛客网 程序员面试金典 C++ Python 题目描述 实现一个算法,删除单向链表中间的某个结点,假定你只能访问该结点. 给定待删除的节点,请执行删除操作,若该节点为尾节点,返回f ...