1304F2 - Animal Observation (hard version) 线段树or单调队列 +DP 题意 用摄像机观察动物,有两个摄像机,一个可以放在奇数天,一个可以放在偶数天.摄像机在同一天可以同时照到k个区域放下去可以持续两天.现在给出每一天每个区域的动物数量,问最多照到动物多少个.如果两个照相机同时照到一个动物只算一次.n<=50 k<=m<=2e4 思路 我们可以考虑只在一天的情况 那么就是一个简单的dp,状态为dp[i][j]第i天放置在区域j可以获得的最大数.那…
详见vfleaking在discuss里的题解. 收获: 当我们要顺序枚举一个序列,并且跳过某些元素,那么我们可以用并查集将要跳过的元素合并到一起,这样当一长串元素需要跳过时,可以O(1)跳过. 暴力: /************************************************************** Problem: 1171 User: idy002 Language: C++ Result: Accepted Time:1908 ms Memory:6732 k…
题目大意:原题链接(定长区间求最值) 给定长为n的数组,求出每k个数之间的最小/大值. 解法一:线段树 segtree节点存储区间的最小/大值 Query_min(int p,int l,int r,int ll,int rr)从编号为p的节点开始在区间[l,r]内查询区间[ll,rr]的最小值 Query_max(int p,int l,int r,int ll,int rr)从编号为p的节点开始在区间[l,r]内查询区间[ll,rr]的最大值 当[l,r]区间完全包含于[ll,rr]区间时,…
Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered from 1 to n in this company, and every staff has a ability. Now, Tom is going to assign a special task to some staffs who were in the same group. In a gr…
时限12s! 所以我用了线段树的黑暗做法,其实正解是用单调队列来做的. //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> #define N 1000001 #define lson l,mid,pos*2 #define rson mid+1,r,pos*2+1 using namespace std; int n,k,xx,yy,ansmax,ansmin,tree[N*…
题意:给你一个序列,求满足要求的子序列个数,其中要求为: 1.子序列的max-子序列长度len<=k 2.子序列中不出现重复的数字 题解:首先看到子序列max,很容易想到枚举最大值然后分治,这个做法有人通过,但是我并没想到如何做 子序列max还有一个思路是单调队列,这里我们通过单调队列进行解题 首先对于给出的限制条件式子max-(r-l+1)<=k,我们进行移项,可得max+l<=k+r+1,此时我们将l和r分离至不等式两边 容易看出我们可以枚举右端点,然后维护一个权值线段树,每次只需要…
\(10^18\)是要long long的. \(nlogn\)单调队列上维护\(logn\)线段树. #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); a <= (c); ++ a) #define nR(a,b,c…
https://codeforces.com/contest/1304/problem/F2 #include<bits/stdc++.h> using namespace std; ; ][maxn]; ][maxn]; ][maxn]; int n,m,k; struct node{ int l,r; int Max,lz; }seg_t[maxn*]; void build(int l,int r,int p){ seg_t[p].l = l,seg_t[p].r = r; if(l =…
Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树) 题目链接 题意 给定一个nm的矩阵,每行取2k的矩阵,求总共矩阵里的数的和最大值,重复取到的数不算 题解 dp[i]表示当前行从第i个数开始取矩阵的最大值 dp[i] = 上一行中最大数 + 当前行第i个数到第i+k-1个数的和 - 当前行重复的 + 下一行第i个数到第i+k-1个数的和 用线段树维护 上一行中最大数 + 当前行第i个数到第i+k-1个数的…
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input output:standard output Little girl Masha likes winter sports, today she's planning to take part in slalom skiing. The track is represented as a grid comp…
题目描述 给出一棵树,点有点权.多次增加某个点的点权,并在某一棵子树中询问:选出若干个节点,使得每个叶子节点到根节点的路径上至少有一个节点被选择,求选出的点的点权和的最小值. 输入 输入文件第一行包含一个数n,表示树的大小. 接下来一行包含n个数,表示第i个点的权值. 接下来n-1行每行包含两个数fr,to.表示书中有一条边(fr,to). 接下来一行一个整数,表示操作的个数. 接下来m行每行表示一个操作,若该行第一个数为Q,则表示询问操作,后面跟一个参数x,表示对应子树的根:若 为C,则表示修…
不知道为什么要把这两个没什么关系的算法放到一起写...可能是都很黑科技? 1.线段树分治 例题:bzoj4026 二分图 给你一个图,资瓷加一条边,删一条边,询问当前图是不是二分图 如果用 LCT 的话我们要维护关于删除时间的最大生成树,然后每进来一条边判断奇环,就很难写 线段树分治可以很好的解决这种有插入有删除单点询问的问题 如果没有加入边和删除边的操作,显然我们可以用带权并查集判断奇环解决 然后我们就要考虑怎么把带加入和带删除的问题转换成没有加入和删除的问题 我们记一下每条边存在的时间区间,…
gugu  bz lei了lei了,事独流体毒瘤题 一句话题意:任选一个点开始,每个时刻向前走一步或者站着不动 问实现每一个点都在$T_i$之后被访问到的最短时间 Step 1 该题可证: 最优方案必然是从某一格开始后一直等着然后走一圈正好全部访问到 证明: 如果时间倒流那就是从时刻T开始每一时刻向前走或是停着不动,每个元素过了T[i]会消失 如果这样的话你肯定是马不停蹄往前走对吧 所以反过来就是上面的结论 Q.E.D 上面的结论还有其他正确的表示方法,该方法仅供参考 如果您能想出其他证明,那么…
[HDU4867]Xor (线段树分治+类数位dp) 提供一种\((m+n) log a log m\)带有常数约\(\frac{1}{log n}\)的算法 处理询问,将后来加入的数算进序列中,则每个数\(a_i\)都有一段出现的区间\([L,R]\) 离线询问后,我们考虑用线段树分治将这些数加入到询问区间上 由于最多只有5000个修改操作,事实上这些数在线段树上覆盖的区间最多只有\(10000logm\)个,并且有着极其不满的常数(因为每个位置上的数都由多段区间组合而来,总长为\(m\),或…
题目传送门(内部题116) 输入格式 第一行两个整数$n,m$,如题 第二行有$n$个整数表示$h_1-h_n(1\leqslant h_i\leqslant 10^9)$ 接下来有$m$行,每行两个整数,$p,H_p$,表示第$p$个位置的苹果实际高度为$H_p$. 输出格式 输出共$m$行,每行一个整数,表示这种修改情况下的答案. 样例 样例输入: 5 3 1 2 3 4 4 1 5 5 5 2 3 样例输出: 1 5 3 数据范围与提示 样例解释: 第一种情况 苹果高度为$5\ 2\ 3\…
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai,Bi,Vi分别表示道路(Ai,Bi),其价值为Vi 其中城市由1..N进行标号 输出 输出最大平均估值,保留三位小数 样例输入 4 2 3 1 2 1 1 3 2 1 4 3 样例输出 2.500 提示 N<=100000,1<=L<=U<=N-1,Vi<=1000000 这题算…
传送门 在最优的情况下,序列\(s_1,s_2,...,s_k\)中,\(s_i (i \in [2 , k])\)一定会是\(s_{i-1}\)的一个\(border\),即\(s_i\)同时是\(s_{i-1}\)的前缀和后缀,否则一定可以通过减去\(s_{i-1}\)的一个前缀和后缀使得满足条件. 对原串建立\(SAM\),因为有互为后缀的条件,所以\(s_1,s_2,...,s_k\)会对应\(parent\)树一条链上的若干状态. 发现可以在\(parent\)树上DP.设\(f_i\…
Wannafly挑战赛18 E 极差 题意 给出三个长度为n的正整数序列,一个区间[L,R]的价值定义为:三个序列中,这个区间的极差(最大值与最小值之差)的乘积. 求所有区间的价值之和.答案对\(2^{32}\)取模. 题解 如果只有一个区间,我们可以枚举区间右端点,当右端点向右移动,左端点在[x, r]的一些区间的值会发生改变,可以用单调栈和线段树维护. 至于三个区间,可以用八棵线段树维护选中的某几个区间想乘的值. 代码 #include<bits/stdc++.h> using names…
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根节点的最大匹配&方案数,$g[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配不选择根节点的最大匹配&方案数.那么这是一个很普通的树形dp. 注意到区间长度相等的线段树的结果是一样的,且每层至多有两种区间长度不同的区间(参考 这题 ),因此直接以区间长度为状态进行记忆化搜索即可. 这…
题意:给你一串数a再给你一些区间(lef,rig),求出a[lef]%a[lef+1]...%a[rig] 题解:我们可以发现数字a对数字b取模时:如果a<b,则等于原数,否则a会变小至少一半.就是说a最多成功取模(log2 a)次,所以我们只需要每次在区间内找到最前面一个小于等于a的值,接着更新a与区间左端点,直到没有值比a小或者区间取模完成. 我们可以使用线段树求出区间内小于某个值的最前一个位置,具体方法就是:父节点记录区间最小值,接着当这一整段的最小值小于等于给定的值时就递归进此子树(另一…
---题面--- 题解: 首先题目要求删除一些颜色,换个说法就是要求保留一些颜色,那么观察到,如果我们设ll[i]和rr[i]分别表示颜色i出现的最左边的那个点和最右边的那个点,那么题目就是在要求我们选出的区间要满足区间[l, r]内所有颜色的max(rr[i]) <= r,并且min(ll[i]) >= l. 因为是区间相关的问题,又涉及到左右端点,因此我们考虑扫描线,那么考虑如何维护它. 因为每个颜色的ll[i]和rr[i]可以看做构成了一个区间,那么现在已经进入线段树的节点就分2种情况.…
#include<bits/stdc++.h>using namespace std;int st[1000007];int top;int s[1000007],t[1000007];int mx[4000007];int sum[4000007];int head[1000007],to[2000007],nex[2000007];int n,k;int a[10000077];int dfn;int tot;void pushup(int rt){    mx[rt]=max(mx[rt…
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这段区间的单调栈的大小 那么这题就是用线段树来维护这个单调栈 len[k]表示对于区间k来说单调栈的大小是多少 那么自底向上maintain(k)的时候,len[k]=len[lson]+find(rson,max[lson]) find(k,x)就是表示以数字x进去k区间,那么能走的步数是多少 那么…
写得很好的题解 一眼过去很像是:排序,然后从前向后扫,有这个区间时插到树里,过去以后再删除.然后事实也是这样做的…… 具体起来: 1.如果考虑暴力的话,一种想法是枚举左端和右端要选取的区间(如果我们按长度排序的话),那么只要发现当前选取的这些从左到右的区间可以得到m及以上就可以了,没必要特地考虑具体选哪些,然后ans = min(ans, 右len - 左len)即可. 2.判断这些区间是否可行的方法是:出现一个区间就把区间内所有点+1,线段树维护最大值,所以segment[1].maxx >=…
P4198 楼房重建 题目链接 https://www.luogu.org/problemnew/show/P4198 题目描述 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个二维平面上.小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)…
题目描述 小$w$来到天堂的门口,对着天堂的大门发呆.大门上有一个二分图,左边第$i$个点连到右边第$p_i$个点.(保证$p_i$是一个排列).小$w$每次可以找左边某个对应连线尚未被移除的点$i$,付出$c_i$的代价之后删除左边第$i$个点到右边第$p_i$个点的连线,以及所有和它们相交的连线.请问小$w$最少要花多少钱来删除所有连线? 输入格式 一行一个整数$n$表示两边点的个数.一行$n$个整数表示$p_i$.一行$n$个整数表示$c_i$. 输出格式 一行一个整数表示答案. 样例 样…
线段树优化dp的常见套路题,就是先按某个参数排序,然后按这个下标建立线段树,再去优化dp 本题由于要维护两个数据:最小值和对应的方案数,所以用线段树区间合并 /* dp[i]表示第i个套娃作为最内层的最小浪费空间 dp[i]=min(dp[j])+out[i]-in[i]; 那么按照out排序后按下标建立线段树,节点维护的是二元组(区间最小值,这个最小值对应的方案数) 求dp[i]时二分找到out[j]<=in[i]的区间[1,pos],然后线段树里查询再更新 处理方案数,线段树向上合并时,只保…
题目实际上是求环套树森林中每个环套树的直径. 对于环套树的直径,可以先找到这个环套树上面的环.然后把环上的每一点都到达的外向树上的最远距离作为这个点的权值. 那么直径一定就是从环上的某个点开始,某个点结束的. 把环拆成链,定义dp[i]表示第i个点为结束点的最远距离,显然有dp[i]=val[j]+sum[i]-sum[j-1]+val[i].显然可以用单调队列优化这个DP. 剩下的就是这样依次统计每个环套树的直径之和. 对于环套树上找环可以借鉴最小树形图找环的技巧. 首先将边定向,保证每个点的…
题目链接 BZOJ3242 题解 题意很清楚,找一点使得最远点最近 如果是一棵树,就是直径中点 现在套上了一个环,我们把环单独拿出来 先求出环上每个点外向树直径更新答案,并同时求出环上每个点外向的最远距离\(val[i]\) 首先要明白以下事实: ①删掉任意一条边不会使答案更优 ②环上存在一条边,使得删掉后答案不变 所以我们要做的就是枚举这条边,然后快速求出断掉后的直径 如何快速求出一棵树的直径? 我们同样在剩余的环上找一个断边,直径只有两种情况: ①在断边的任意一侧 ②经过断边 情况①,我们只…
[Wc2010]重建计划 Time Limit: 40 Sec  Memory Limit: 162 MBSubmit: 4345  Solved: 1054[Submit][Status][Discuss] Description Input 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai,Bi,Vi分别表示道路(Ai,Bi),其价值为Vi 其中城市由1..N…