题面传送门 这道题为什么我就没想出来呢/kk 对于每组询问 \([l,r]\),我们首先求出区间 \([l,r]\) 中最小值的位置 \(x\),这个可以用 ST 表实现 \(\mathcal O(n\log n)-\mathcal O(1)\) 维护,那么显然 \(\forall l'\in[l,x],r'\in[x,r],\min\limits_{t\in[l',r']}a_t=a_x\),产生的贡献为 \((r-x+1)(x-l+1)a_x\),于是我们只用计算 \([x+1,r],[l,…
传送门 思路 看到可离线.无修改.区间询问,相信一定可以想到莫队. 然而,莫队怎么转移是个大问题. 考虑\([l,r]\rightarrow[l,r+1]\)时答案会怎样变化?(左端点变化时同理) \(ans+=\sum_{i=l}^r \min\{a_i,a_{i+1} ,\dots ,a_r\}\). 那么这东西如何快速统计呢? 考虑使用前缀和. 首先,显然要用单调栈预处理每个点左边最靠右的第一个比它小的数的位置\(L_i\),和ST表处理出RMQ的位置. 预处理出对于每一个\(r\),\(…
题意 题目链接 Sol 好像搞出了一个和题解不一样的做法(然而我考场上没写出来还是爆零0) 一个很显然的思路是考虑每个最小值的贡献. 预处理出每个数左边第一个比他小的数,右边第一个比他大的数. 那么\([L_i + 1, i]\)对\([i, R_i]\)中的每个数都会有\(a[i]\)的贡献. 我们可以抽象成一个二维平面内的矩形加. 询问就是询问最下角为\((l, l)\),右上角为\((r, r)\)的矩形内的权值 也就是我们需要解决这么一个问题:两个操作, 矩形加矩形求和,而且前者都在后者…
传送门 题解 //minamoto #include<iostream> #include<cstdio> #define ll long long using namespace std; #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) <<],*p1=buf,*p2=buf; int read(){ #define num c…
正解:单调栈+线段树 解题报告: 传送门! 首先考虑不修改的话就是个单调栈板子题昂,这个就是 然后这题的话,,,我怎么记得之前考试好像有次考到了类似的题目昂,,,?反正我总觉着这方法似曾相识的样子,,,想不起来辣,慢慢落实之前考题的时候再说趴QAQ 然后具体看到这道题的话,就是用个线段树,每个节点记录这个节点的最长序列和最大斜率 然后对于左右两个子节点合并 首先左节点直接保存下来就好 然后右节点,可以继续分半递归查找找到能合并的最左边节点 挺好理解的就是不太好表示,具体看代码算了QAQ 这样修改…
正解:单调栈/悬线法 解题报告: ummm这题我当初做的时候一点思路也没有只会暴力出奇迹:D(啊听说暴力好像能水过去呢,,, 然后当初是看的题解,然后学了下悬线法 然后就忘了:D 然后我现在看发现看不懂辽:D #论写题解的好处:D 所以赶紧来写个题解QAQ ummm悬线法这个玩意儿会单独写个学习笔记的到时候放链接QAQ所以这里不详解了 反正这题就相当于是个最大子矩阵的玩意儿?有点悬线法板子题的意思蛤? 那如果知道悬线法就可以直接过了,好了没了感觉没太多可说的QAQ 然而这题谢总是布置在单调栈专题…
题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i个元素的值.接下来q行,每行包含两个整数l和r,代表一次询问. 输出 对于每次询问,输出一行,代表询问的答案. 样例输入 5 5 5 2 4 1 3 1 5 1 3 2 4 3 5 2 5 样例输出 28 17 11 11 17 题解 单调栈+离线+扫描线+树状数组区间修改区间查询 首先把使用单调栈…
正解:单调栈/dp 解题报告: 先放个传送门qwq 话说这题是放在了dp的题单里呢?但是听说好像用单调栈就可以做掉所以我就落实下单调栈的解法好了qwq (umm主要如果dp做好像是要斜率优化凸壳维护双端队列巴拉巴拉可能要以后再来搞了qwq) 先解释题意...我觉得我是傻逼,,,这题我因为没懂题意卡了好几周了有... 是酱婶的,就是说给一些气球,开始它们都只是瘪的,都还没打气 然后给你这些气球的横坐标和最大半径 然后问你,我现在一个个给气球打气,打到不能打为止,问你每个气球的半径 (,,,我之前一…
P3400 仓鼠窝 题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有多少个子长方形嘛.)比如说有一个2*3的矩阵,那么1*1的子矩阵有6个,1*2的子矩阵有4个,1*3的子矩阵有2个,2*1的子矩阵有3个,2*2的子矩阵有2个,2*3的子矩阵有1个,所以子矩阵共有6+4+2+3+2+1=18个. 可是仓鼠窝中有的格子被破坏了.现在小仓鼠想要知道,…
先上一波题目 https://www.luogu.org/problem/P1198 题目要求维护后缀最大值 以及在数列的最后面添加一个数 这道题呢我们有两种做法 1.单调栈 因为只需要维护后缀最大值 而我们每次插入都是在最后面添加一个数 所以我们可以维护一个单调栈 栈底到栈顶逐渐增大 因为如果一个数他的位置在你的前面且他比你小 那么他便不会对前面位置的最大值产生影响 可以直接省略 我们在查询的时候只需要二分一下答案 找到比查询位置后的最接近查询位置的数的值就是答案了 #include<cstd…