给一篇题解。(下面这张图是从 luogu 上粘贴的,因为不太会画图)

其中纵坐标为 \(t\),横坐标为 \(a_i\)。

发现同颜色块只有平行四边形和直角梯形(等腰直角三角形)两种情况。

可以将直角梯形削去左下角,分成两部分考虑。

等直可以直接暴力插入区间,总个数 \(O(n)\)。

平行四边形可以看作上三角+中平四/矩形+下三角,矩形不变,平四直接将赋值区间平移即可。

感觉最多有 \(O(n\log n)\) 个区间,加上树状数组应该是 \(O(n\log^2n)\),但是由于其中 \(dep\) 优化+根本跑不满,所以跑得飞快。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,dep,a[N],b[N];
int l[N],r[N],ga[N];
int m,tp,st[N],gb[N];
int mx,ans[N],c[N*2][3];
void add(int x,int y,int k){
for(;x<=n*2;x+=x&-x)
c[x][y]+=k;
}int sum(int x,int y){
int re=0;
for(;x;x-=x&-x)
re+=c[x][y];
return re;
}struct node{
int l,r,id;
};vector<node>qu[N];
struct upd{
int id,ad;
};vector<upd>w1[N],w2[N];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i],mx=max(mx,a[i]);
a[n+1]=mx+1;st[++tp]=n+1;
for(int i=n;i;i--){
while(a[i]>a[st[tp]]) tp--;
r[i]=st[tp];
if(a[i]==a[st[tp]]) st[tp]=i;
else st[++tp]=i;
}tp=0;
for(int i=1;i<=n;i++){
while(tp&&a[i]>=a[st[tp]]) tp--;
if(!st) st[++tp]=i;
else l[i]=st[tp],st[++tp]=i;
}for(int i=1;i<=n;i++)
gb[i]=r[i]-i,dep=max(dep,gb[i]);
for(int i=1;i<=n;i++){
if(!l[i]){
ga[i]=dep-gb[i]+1;
for(int j=ga[i]+1;j<=dep;j++)
w1[j].push_back({j-ga[i]-1+i,a[i]});
}else ga[i]=i-l[i];
}for(int i=1;i<=m;i++){
int t,l,r;cin>>t>>l>>r;
qu[t].push_back({l,r,i});
}for(int i=1;i<=n;i++)
b[i]=max(a[i],b[i-1]),add(i,2,b[i]);
for(int i=dep;i<=n;i++)
for(auto y:qu[i])
ans[y.id]=sum(y.r,2)-sum(y.l-1,2);
for(int i=1;i<=n;i++){
if(ga[i]>=gb[i])
for(int j=1;j<=gb[i];j++){
w1[j].push_back({i+j-1,a[i]});
w1[ga[i]+j].push_back({i+j-1,-a[i]});
}
else for(int j=1;j<=ga[i];j++){
w2[j].push_back({i-j+1,a[i]});
w2[gb[i]+j].push_back({i-j+1,-a[i]});
}
}for(int i=1;i<=dep;i++){
for(auto y:w1[i]) add(y.id,0,y.ad);
for(auto y:w2[i]) add(y.id+n,1,y.ad);
for(auto y:qu[i-1])
ans[y.id]=sum(y.r,0)-sum(y.l-1,0)+sum(y.r-i+1+n,1)-sum(y.l-i+n,1);
}for(int i=1;i<=m;i++) cout<<ans[i]<<"\n";
return 0;
}

[JOI 2020 Final] 火事 题解的更多相关文章

  1. JOI 2020 Final 题解

    T1. 只不过是长的领带 大水题,把 \(a_i,b_i\) 从小到大排序. 发现最优方案只可能是大的 \(a_i\) 跟大的 \(b_i\) 匹配,小的 \(a_i\) 与小的 \(b_i\) 匹配 ...

  2. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  3. JOI 2018 Final 题解

    题目列表:https://loj.ac/problems/search?keyword=JOI+2018+Final T1 寒冬暖炉 贪心 暴力考虑每相邻两个人之间的间隔,从小到大选取即可 #incl ...

  4. 「JOI 2017 Final」JOIOI 王国

    「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...

  5. 「JOI 2015 Final」分蛋糕 2

    「JOI 2015 Final」分蛋糕 2 题解 这道题让我想起了新年趣事之红包这道DP题,这道题和那道题推出来之后的做法是一样的. 我们可以定义dp[i][len][1] 表示从第i块逆时针数len ...

  6. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  7. LOJ#2351. 「JOI 2018 Final」毒蛇越狱

    LOJ#2351. 「JOI 2018 Final」毒蛇越狱 https://loj.ac/problem/2351 分析: 首先有\(2^{|?|}\)的暴力非常好做. 观察到\(min(|1|,| ...

  8. JOI 2019 Final合集

    JOI 2019 Final 合集 #3010. 「JOI 2019 Final」勇者比太郎 其实如果读懂题了就是水题了 题目就是让你求满足条件的\(JOI​\),使得\(O​\)在\(J​\)同行的 ...

  9. 【LOJ】#3014. 「JOI 2019 Final」独特的城市(长链剖分)

    LOJ#3014. 「JOI 2019 Final」独特的城市(长链剖分) 显然我们画一条直径,容易发现被统计的只可能是直径某个距离较远的端点到这个点的路径上的值 用一个栈统计可以被统计的点,然后我们 ...

  10. 「JOI 2014 Final」飞天鼠

    「JOI 2014 Final」飞天鼠 显然向上爬是没有必要的,除非会下降到地面以下,才提高到刚好为0. 到达一个点有两种情况:到达高度为0和不为0. 对于高度不为0的情况,显然花费的时间越少高度越高 ...

随机推荐

  1. cajviewer逆向分析与漏洞挖掘

    文章首发于 https://mp.weixin.qq.com/s/7STPL-2nCUKC3LHozN6-zg 前言 CAJViewer是一个论文查看工具,主要用于查看caj文件格式的论文.本文介绍对 ...

  2. 12C++循环结构-for循环(2)——教学

    一.循环变量为字符型 (第32课 26个兄弟姐妹)参考视频1 试编一程序,按字典顺序输出26个字母. 流程图: 思考:先顺序输出26个小写英文字母,再逆序输出26个大写英文字母. 循环可以是递增型循环 ...

  3. Redis应用—6.热key探测设计与实践

    大纲 1.热key引发的巨大风险 2.以往热key问题怎么解决 3.热key进内存后的优势 4.热key探测关键指标 5.热key探测框架JdHotkey的简介 6.热key探测框架JdHotkey的 ...

  4. 从底层源码深入分析Bean的实例化

    生命周期的整体流程 Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁. ...

  5. IOS多线程之NSOperation(1)

    IOS多线程之NSOperation(1) NSOperation 是 OC 语言中基于 GCD 的面向对象的封装: 提供了一些用 GCD 不好实现的功能: 线程的生命周期由系统自动管理. NSOpe ...

  6. 【前端】【H5 API】addEventListener监听网络状态的变动

    WebviewObject Webview窗口对象,用于操作加载HTML页面的窗口 属性 id:webview窗口的标识 方法:监听 addEventListener 添加事件监听器 wobj.add ...

  7. Qt/C++加载不同的地图控件/地图类型/缩放标尺/缩略图/比例尺/实时路况/全景视图等

    一.前言说明 在展示地图的时候,有些常规的操作,比如调整地图的缩放级别,切换到卫星图等,希望能够在地图上直接操作实现,于是就有了一堆地图控件,可以根据自己的需求动态的添加和删除,这样就更直接更快捷,而 ...

  8. Qt编写物联网管理平台35-实时曲线

    一.前言 设备采集到的数据,通过曲线展示也是一种非常好的方式,尽管之前已经有了表格数据展示.设备面板展示.设备地图展示等,实时曲线也是一种不错的方式,这个用户自由选择,反正通过端口已经拿到了所有要采集 ...

  9. 到底什么是Java AIO?为什么Netty会移除AOI?一文搞懂AIO的本质!

    本文由得物技术团队Uni分享,本文有内容修订和大量排版优化. 1.引言 关于Java网络编程中的同步IO和异步IO的区别及原理的文章非常的多,具体来说主要还是在讨论Java BIO和Java NIO这 ...

  10. 使用pytorch从零开始实现一个简单的gpt

    使用pytorch从零开始实现一个简单的gpt 本文由prompt引导ChatGPT生成简易版gpt模型,根据比较关心的问题,使用了以下的prompt进行内容和代码的生成: prompt:->如 ...