将问题差分,即求$\sum_{i=1}^{r}S_{i}(t)-\sum_{i=1}^{l-1}S_{i}(t)$,由于两者类似,不妨考虑前者

构造矩阵$A_{i,j}=S_{j}(i)-S_{j}(i-1)$,记初始的序列为$a_{i}$,则$S_{i}(t)=a_{i}+\sum_{j=1}^{t}A_{j,i}$

将之代入,即求$\sum_{i=1}^{r}(a_{i}+\sum_{j=1}^{t}A_{j,i})$,前者直接前缀和即可,下面考虑后者,即求矩阵$A$

对于每一个$i$,求出所有$S_{j}(i-1)=a_{i}$且$S_{j}(i)\ne a_{i}$的$A_{i,j}$,显然即包括了所有位置

具体的,这些位置形式如下:令$x=\max_{x\le i,a_{x}>a_{i}}x$(若不存在则跳过)和$y=\min_{y>i,a_{y}\ge a_{i}}y$(若不存在则为$n+1$),即$\forall i\le j<y,A_{j-x,j}=a_{x}-a_{i}$

这个用数据结构不易维护,但我们可以考虑其对某一次询问的贡献,即$(a_{x}-a_{i})\sum_{i\le j<y,j-x\le t,j\le r}1$,关于后者再简单处理即$(a_{x}-a_{i})\max(\min(y-1,t+x,r)-i+1,0)$

下面,对$\min(y-1,t+x,r)$的值分类讨论:

1.$y-1$为最小值,即$t\ge y-x$且$r\ge y$

2.$t+x$为最小值,即$i-x\le t\le y-x-1$且$r-t\ge x$

3.$r$为最小值,即$i\le r\le y-1$且$r-t\le x-1$

得出上述结果时,注意:

1.最小值还需要满足$\ge i$,否则显然贡献为0,不需要考虑

2.注意等号和不等号,使得在相等时最小值仍被唯一确定

对每一种情况分别处理(后相加),将其中后者的限制通过排序解决,前者在排序后用线段树维护即可

时间复杂度为$o(n\log n)$,可以通过

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

[loj3256]火灾的更多相关文章

  1. 【OpenCV】基于图像处理和模式识别的火灾检测方法

    学期末一直忙考试,大作业,很久没来CSDN耕耘了... 虽然考试都结束了,手头还是累积了不少活儿要补,不多写了,晒个小项目,之前一直做的,后来当做模式识别课程的大作业交了. 大体框架如下: 还是之前的 ...

  2. Arduino+sim800C家居安防火灾报警 拨打电话 发送短信例程程序

    家居安防报警器,参考程序. 火灾报警 涉及用sim800c发短信,拨打电话通知. 接线: Sim800c 3.3V -> Arduino 3.3V Sim800c GND -> Ardui ...

  3. 2022极端高温!机器学习如何预测森林火灾?⛵ 万物AI

    作者:ShowMeAI编辑部 声明:版权所有,转载请联系平台与作者并注明出处 收藏ShowMeAI查看更多精彩内容 今年夏天,重庆北碚区山火一路向国家级自然保护区缙云山方向蔓延.为守护家园,数万名重庆 ...

  4. 程序员装B指南

    一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率很高 ...

  5. 使用Hystrix提高系统可用性

    今天稍微复杂点的互联网应用,服务端基本都是分布式的,大量的服务支撑起整个系统,服务之间也难免有大量的依赖关系,依赖都是通过网络连接起来. (图片来源:https://github.com/Netfli ...

  6. 构建高可用ZooKeeper集群

    ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分布式基础服务.由于 Zo ...

  7. 【Pyrosim案例】02:简单燃烧

    1 案例说明 本案例介绍一个简单的燃烧模拟. 本案例通过指定热释放率(Heat Release Rate,HRR)来定义一个500kW的燃烧火焰.利用热释放率来定义燃烧火焰在火灾安全工程中描述火焰的一 ...

  8. MSP430FR2系列单片机破解芯片解密多少钱?

    MSP430FR2系列单片机破解芯片解密 MSP430FR2xx系列单片机芯片解密型号: MSP430FR2533.MSP430FR2110.MSP430FR2310.MSP430FR2311.MSP ...

  9. jQuery Colorbox弹窗插件使用教程小结、属性设置详解

    jQuery Colorbox是一款弹出层,内容播放插件,效果极佳,当然我主要是用来弹出图片啦. jQuery Colorbox不仅有弹性动画效果,淡入淡出效果,幻灯片播放,宽度自定义,还能够ajax ...

随机推荐

  1. Serverless 如何在阿里巴巴实现规模化落地?

    作者 | 赵庆杰(卢令) 来源 | Serverless 公众号 一.Serverless 规模化落地集团的成果 2020 年,我们在 Serverless 底层基建上做了非常大的升级,比如计算升级到 ...

  2. CF123E Maze(期望dp,树形dp,式子)

    题目大意: 给你一棵树,边权都是1,每一个点有一个是起点的概率和一个是终点的概率,你将以起点为根,开始在树上随机dfs,每到一个点,就会将他的所有儿子随机打乱成序列,然后按照那个随机顺序走完,直到走到 ...

  3. 手把手教你学Dapr - 1. .Net开发者的大时代

    Dapr全称 Distributed Application Runtime,分布式应用运行时 Dapr的口号 简化云原生应用开发,聚焦在应用的核心逻辑,让代码简单.可移植 Dapr的目标 最佳实践的 ...

  4. 【二食堂】Alpha - Scrum Meeting 10

    Scrum Meeting 10 例会时间:4.20 18:00~18:20 进度情况 组员 昨日进度 今日任务 李健 1. 与柴博合作完成登录注册页面issue 继续完成登录注册页面issue 柴博 ...

  5. eureka服务端的高可用

    eureka client的高可用这个很简单,只需要向eureka服务端上多注册几个实例即可,那么eureka server端如何实现高可用呢?其实eureka server 端也是可以做为一个客户端 ...

  6. Noip模拟44 2021.8.19

    比较惊人的排行榜 更不用说爆零的人数了,为什么联赛会这么难!!害怕了 还要再努力鸭 T1 Emotional Flutter 考场上没切掉的神仙题 考率如何贪心,我们把黑色的条延长$s$,白色的缩短$ ...

  7. Codeforces Round #742 (Div. 2)题解

    链接 \(A,B\)题签到,就完了. \(C\)题,考虑进位时多进一位,由于是隔一位进的,所以可以发现奇数位和偶数位是相互独立的,那么我们就把奇数位和偶数位单独拉出来组成数字例如:34789,我们单独 ...

  8. hdu 1198 Farm Irrigation(并查集)

    题意: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...

  9. WPF进阶技巧和实战03-控件(3-文本控件及列表控件)

    系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...

  10. js this指向汇总

    this指向 普通函数  window 定时器函数         window 事件函数 事件源 箭头函数 父function中的this,没有就是window 对象函数 对象本身 构造函数 实例化 ...