当前搜索:
如果没有限制,显然根据排序不等式
当每个点最多有一个限制不能选的时候,有一个很重要的性质
性质:i对应的点与i的距离<=2
证明:
设有一种情况i对应i+3
i—–(i+3)
i+1—(i+2)
i+2—(i)
i+3—(i+1)
那么,对于i...
首先肯定是一段模 dd 相同的数
然后枚举左端点 那么右端点应该满足条件 数字不重复出现且 maxvl,r−minvl,r≤r−l+kmaxv_{l,r}-minv_{l,r}\le r-l+k,这个最大最小值是除过 dd 的
也就是maxvl,r−minvl,r−r≤k−lmaxv_{l,r...
题目大意:给出平面上n个带权点,有正有负,求平面上两条平行直线之间的点权和最大是多少
VIEW PROBLEM - BULLDOZER (JOI17_BULLDOZER)直接枚举斜率,点按照距离排序后是一个最大子段和问题
然后考虑扫描线旋转斜率,两个点相对关系变化只会发生在斜率与两点连线平行的...
从小到大枚举xx,剩下的限制是y>bi⋀z>ciy>b_i \bigwedge z>c_i或者y>bi⋁z>ciy>b_i \bigvee z>c_i 对应的是平面上一个矩形或者挖掉一个矩形
发现平面上矩形的交取个min就好了,挖掉的矩形要取并,...
线段树 直接维护一段区间的答案 以及左右边界之间的连通性
然后合并的时候 根据中线并查集合并下
这么大常数竟然过了#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace ...
详见lzz的集训队论文二进制分组做法二进制分组是在线段树的结构上做的 方便区间查询
至于删除 采用延迟重构的思想 每一层只有最后一个区间是萎的 我们需要递归下去 询问还是O(logn)O(\log n)个节点 重构复杂度势能分析下O(nlogn)O(n\log n)
只有上凸包是有效的 合并的...
详见吉丽的集训队论文吧我们发现修改操作可以变为这样一个形式S:x=max(x+A,B)S:x=max(x+A,B)
这个标记是可以合并的 就可以求当前值了
现在还要历史最值 我们就再加一个标记SSSS表示历史最大的标记 因为这个形式是一条折线 所以历史最大也是可以合并的
具体的我们两段时间有...
[Segment tree Beats! || 分块] Codeforces 793F Tinkoff Challenge - Elimination Round F. Julia the snail
我们用fif_i表示左边界是ii的答案 一条线段[a,b][a,b]对答案的影响是 f1f_1到flf_l中大于等于aa的都跟bb取max
这个可以用线段树科技做 复杂度证明跟区间最值操作的势能分析应该差不多#include<cstdio>
#include<cstdlib&g...
这个我们首先可以转化成一个二分图最大匹配的模型
但是肯定跑不出
首先扫描线 把free的格子剖成O(n)O(n)个矩形
对两边都建成线段树 每个矩形对应两边各O(logn)O(\log n)个点 两两相连
总边数O(nlog2n)O(n\log^2n)#include<cstdio...
线段树的简单应用?#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef long long ll;inline char nc(){
stati...
这个我们发现排好序后跑答案是最大的
然后就是维护一个支持插入的序列 我本来想把权值相同的压成一段 然后就gg 出门左转神犇学弟博客#include<cstdio>
#include<cstdlib>
#include<algorithm>
using name...
拆开柿子之后 发现要维护 ∑xi\sum x_i,∑yi\sum y_i,∑x2i\sum x_i^2,∑xi∗yi\sum x_i*y_i
直接线段树就好了 两个标记合并的时候要注意下 一种可以覆盖另一种
似乎神犇有更短更快的方法?
#include<cstdio>
#incl...
这个题在考场上应该是能搞出来的 可是当时debuff太强 没敢想正解 写完了250行的暴力
正解呢 就是类似zkw线段树 我们从叶节点l−1l-1和r+1r+1一直走直到碰在一起 这样搞出了一条左链和一条右链 左链上的右兄弟和右链上的左兄弟就是所有要找的点 然后我们讨论下查询点uu和链底的lca...
发现旋最小值到根 最小值深度变为1 他的右子树深度不变 其他都加1
旋最大值类似 这个只要线段树就好了 怎么求子树 看他的father
插入操作 找出前驱和后继 一定是祖先子孙关系 新点往深度大的下面挂#include<cstdio>
#include<cstdlib>...
注意这里的本质不同的含义 是左边和右边的障碍集合不同
那么我们要考虑怎么去重 我们要求能向右走就向右走
也就是说我们考虑把所有向左上的角都折叠起来然后就可以扫描线加线段树了
我们遇到一个障碍 就把能爬上来的都统计到障碍上面的那格
注意能爬需要一些判断#include<cstdio&g...
好题 但是懒得写题解
最近特别懒#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;inline char nc(){
...
最近真的懒 Claris的题解#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<queue>
#define pb push_...
不会做QAQ 还是转身向Claris的题解吧#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;inline char nc(){
static char bu...
直接在线段树上区间覆盖咯
怎么求和?
∑x=lr(A∗x) mod B=∑x=lrA∗x−B∗∑x=lr⌊A∗xB⌋\sum_{x=l}^r (A*x)\ mod\ B=\sum_{x=l}^r A*x-B*\sum_{x=l}^r\lfloor {A*x \over B}\rfloor后半...
考虑把每个点看成一个可以在后面加字符的字符串
每次区间加一个字符串 相当于对区间的hash值做一次运算
这个直接线段树就行了#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namesp...