摘要:
题面传送门 考虑做差法,判断最后的值得正负来选择。 一开始有一个想法就是尽可能挫败对手,但是这是显然不正确的。 考虑有一个奇数$x$,有一个偶数$y$。设当前状态为$f_s$,同时设$x<y$ 如果Alice选择奇数,那么最后的结果$f_{s|x|y}=f_s+x-y<f_s$ 反之则$f_{s|x 阅读全文
摘要:
题面传送门 又是一个自己yy出来的数据结构。 考虑在时间轴上建立线段树。 模仿左偏树那题,把修改拆成$logn$个询问。 对于每个节点,用扩展域并查集来维护有没有奇环。然后如果这个区间有奇环那么就直接输出。 但是还有一个问题退出当前节点时要撤销这个点的贡献。 那么可以上按秩合并可持久化并查集即可。 阅读全文
摘要:
题面传送门 这道题直接$cdq$套$cdq$即可。 但是问题是怎么套呢? 考虑$cdq$维护查询和修改的时候,我们对于修改标记$1$,查询标记$0$,所以我们可以在进入下一层$cdq$前将左半边设成修改,而右半边设成查询即可。 还有这道题卡常。 代码实现: #include<cstdio> #inc 阅读全文
摘要:
题面传送门 一道毒瘤题我调两天...... 显然有$dp$式$dp_i=\max\limits_^{X_ja_i+Y_jb_i}$其中$X_i=\frac{r_ia_i+b_i},Y_i=\frac$ 设$k<j$且$k$劣于$j$那么就有式子$-\frac<\frac$ 那么就可以斜率优化了。 但 阅读全文
摘要:
题面传送门 蛮好的一道题目。 题面其实错了,还有只能从左往右建。 考虑暴力$dp$:设$q_i=\sum\limits_$,则$dp_i=\min\limits_{dp_j+q_-q_j+(h_i-h_j)2}$ 显然可以斜优,设$k<j$且$k$劣于$j$,则$dp_j+q_-q_j+(h_i-h 阅读全文
摘要:
题面传送门 考虑怎么把绝对值拆掉。 可以把坐标系旋转四次然后统计左上方的点,这样可以拆掉绝对值。那么就是要找左上方$x+y$最小的点,变成三维偏序问题。 可以用$cdq$分治轻松解决。 注意这道题卡常,可以尝试把$cdq$中的快排换成归并能快好几倍。 同时只对询问查询。 时间复杂度$O(nlog^2 阅读全文
摘要:
题面传送门 把交叉转化成$x_i>x_j&&y_i>y_j$ 然后就是三维偏序板子题了。注意树套树过不去,要用$cdq$分治。 树状数组随便维护一下就好了。 代码实现: #include<cstdio> #include<algorithm> #define max(a,b) ((a)>(b)?(a 阅读全文
摘要:
题面传送门 主要一个方法以前没有接触过现在补一下。 就是判断一个区间平均数有没有到$k$则每个减$k$看总和有没有到$0$。 处理完之后就是求正序对数量分治随便搞就好了。 代码实现: #include<cstdio> using namespace std; int n,m,k,x,y,z,a[10 阅读全文
摘要:
题面传送门 $cdq$分治板子题。 首先两个能互相看到,如果小的一个能看到大的,那么就一定能互相看见。 所以先将视野排序。 然后内部考虑把智商定为第二关键字,因为$k$不变保证了单调性。 位置用动态开点线段树维护即可。 代码实现: #include<cstdio> #include<algorith 阅读全文
摘要:
题面传送门 这道题就是$cdq$分治板子题。 首先排$x$消去一维偏序。 然后先分治子序列,再分治当前序列。 分治时对当前序列两部分分别进行$y$排序。 $cdq$分治的核心是左序列向右序列算贡献。 考虑枚举右序列每一个元素,同时在左序列维护一个指针,指针左侧的$y$值小于等于当前右序列$y$值。 阅读全文
摘要:
题面传送门 这个东西不太好维护,考虑转化成$[a_i+1,n-b_i]$这一区间中的人分数相同。 则只有选出一些区间,这些区间要么完全重合,要么完全不交,这些人才没有说谎。 显然有$O(n2)$$dp$式$dp_i=\min\limits_{dp_j+1[(x_ix_j&&y_iy_j)||x_i> 阅读全文
摘要:
题面传送门 只有询问没有查询,显然可以离线下来算贡献。 先预处理出一号节点到每个叶子节点的距离,然后进入一棵子树是添加贡献,一棵子树遍历完了撤销贡献即可,这个可以用线段树维护。 时间复杂度$O((q+n)logn)$ 代码实现: #include<cstdio> #include<vector> # 阅读全文
摘要:
题面传送门 题解里居然没有对这个东西复杂度严格证明的,我来补一发。 首先暴力$O(n^2)$不再赘述。 可以加上一些剪枝,如果我们对于每个$i$倒序枚举每个$j$,那么如果$a_j|a_{j+1}|⋯|a_i=a_j|a_{j+1}|⋯|a_$,那么就不用往下枚举,因为接下来的一定与前一个所枚举的相 阅读全文
摘要:
题面传送门 数据这么小,显然要网络流。 从源点向每个菜连$1$边,从每个饮料向终点连$1$边。 为了保证每头牛只被算一次,所以对每头牛拆点。 其余照常即可。 代码实现: #include<cstdio> #include<cstring> #include<queue> #define beg(x) 阅读全文
摘要:
题面传送门 还是分治。 考虑建出一棵线段树,每个节点分成$l$到$mid$的后缀线性基和$mid+1$到$r$的前缀线性基,查询推到不能再推时两个线性基合并即可。 时间复杂度$O((n+q)log^2n)$ 代码实现: #include<cstdio> #include<cstring> using 阅读全文
摘要:
题面传送门 一句话题面:区间01背包。 这种东西可以用分治解决掉。 发现如果完全合并两个dp状态是$O(t^2)$的,但是如果只是针对某一个值的合并只是$O(t)$的。所以这题中不能进行合并状态。 预处理线段树上每个节点$l$到$mid$与$mid+1$到$r$的两部分$dp$状态。 在一棵线段树上 阅读全文
摘要:
题面传送门 显然对于两个二元组$(x_i,y_i)\(与\)(x_j,y_j)$,如果$x_i\leq x_j$且$y_i>y_j$那么第二个二元组实际上对于答案是没有贡献的。 所以处理一遍得到的东西满足两个均单调上升。 设$minx_i=\min\limits_$,$miny_i=\min\lim 阅读全文
摘要:
题面传送门 显然这道题有定义$dp_i$表示到$i$点的最大价值,$dp$式$dp_=\max\limits_^{dp_j-(x_i-x_j)^2-(y_i-y_j)2+w_i}$这样的$dp$是$O(n2)$的 考虑怎么优化,显然一列中只有最下面的列转移更优,这样复杂度变成$O(nm)$ 设$g_ 阅读全文
摘要:
题面传送门 数据这么小显然状压dp 考虑状压$dp_i$表示打掉的集合为$i$时最少抛物线条数。 预处理$f_{i,j}$表示过$i$点和$j$点的抛物线经过的点的集合。 但是这样的转移是$O(T2nn2)$的。 考虑怎么优化。 很明显我们的$dp$转移是无序的。将其变成有序即先打最小的点则可优化掉 阅读全文
摘要:
题面传送门 考虑两颗子树如果交换,那么其实对其它子树与这两颗子树的贡献是没有影响的。 那么在线段树合并时判断一下是否要交换即可。 代码实现: #include<cstdio> #define beg(x) int cur=s.h[x] #define end cur #define go cur=t 阅读全文
摘要:
题面传送门 考虑如果是边权怎么做。那么对于每个边从大到小合并然后按次计算贡献即可。 但是这道题是点权。 就有一个方法是把一条边的边权看作两点权最大值。仔细想想就发现是正确的。 代码实现: #include<cstdio> #include<algorithm> #define max(a,b) (( 阅读全文
摘要:
题面传送门 这个构造还是很巧妙的。 有一个显然的性质:序列中所有数的异或和等于最后只有一种数时所有数的异或和。 还有一个结论:当有三个数$a,b,b$时,只要一次操作就能使其变成三个$a$。 那么事实上无解的情况已经呼之欲出了:当$n\bmod 2=1$且序列中的所有数异或和不为$0$即无解。 现在 阅读全文
摘要:
题面传送门 题解里居然没有写线段树上二分的,来交一发。 维护一颗权值线段树,以$h_i$为下标,主要维护两个值,是元素个数和元素和。 那么当前点$m$可以判断左边的节点数$\times m-$左边的元素和是否大于当前的水量来考虑走左边还是右边。走到最后一个节点时计算剩下的水量,然后均摊给每一个试管。 阅读全文
摘要:
题面传送门 这个东西显然不能矩阵乘法(暴论) 考虑手推几组数据。 比如这组: 1 999 100000000000000 这东西怎么推啊,这不是要死人的节奏吗。 别急,推推看就知道了。 \(f_0=999\) \(f_1=999+9\times 9=1080\) \(f_2=1080+0\times 阅读全文