题解
李超线段树线性动态规划(线性 DP)
题意
 $n$  天开始时有  $S$  元钱,每天  $A$  种股票价格为  $a_i$ , $B$  种价格为  $b_i$ 。然后出售必须  $A$  和  $B$  出售相同比例,买入时  $A$  和  $B$  必须按照  $r_i$  的比例买入。
求最后的钱最多是多少。
 $n\leq10^5$ 。
题解
可以证明要买全买要卖全卖。
设  $f_i$  为第  $i$  天最多拥 …
Jayun 发布于 2023-11-17 14:58:10
00
双指针二叉堆贪心
题意
数轴上有  $k$  个点是草地,每个草地有不同收益, $m$  个点是地方的点,现在你要放置  $n$  个我方的点,不能和敌方的点重合。
如果一个草地离最近的我方的点距离严格小于最近的敌方点距离,那么这个草地被占领。
给出敌方点和草地坐标(保证两两不同),求占领草地的最大收益和 。
 $1\leq n,m,k\leq 2\times10^5,1\leq x\leq 10^9$ 。
题解
 …
Jayun 发布于 2023-11-17 10:36:43
00
线段树分治基础栈并查集
Pastoral Oddities
题面
给定一张  $n$  个点的无向图,初始没有边。
依次加入  $m$  条带权的边,每次加入后询问是否存在一个边集,满足每个点的度数均为奇数。
若存在,则还需要最小化边集中的最大边权。
 $n \le 10^5$ , $m \le 3 \times 10^5$ 。
题解
线段树分治好题。
每条边要么选不了,要么选完后被取代再也回不来。这就是在时间的一个区间 …
Jayun 发布于 2023-11-17 09:11:52
00
极角排序凸包计数容斥原理双指针
题目大意
二维平面上有一些点,保证不存在重合的点和三点共线。求每一个点集的凸包在平面上包含的点数的和。
 $n\leq1000$ 。
题解
有趣的。
假如所有点都在所有凸包内,答案  $n2^n$ 。
考虑斥掉不合法的。对于一个点对,它们直线分割的半平面,两个平面内的点不能同时取。那么枚举一个点,把所有点挪到以它为原点的坐标系,然后极角排序,双指针维护半平面的区间即可。
本题的启发:如果有“不存在 …
Jayun 发布于 2023-11-16 16:43:52
00
组合意义线性动态规划(线性 DP)排列组合
[AGC001E] BBQ Hard
题面
有  $n$  个数对  $(a_i, b_i)$ ,求出
$$\sum_{i=1}^{n}\sum_{j=i + 1}^{n}{a_i+b_i+a_j+b_j \choose a_i+a_j}
$$
答案对  $10 ^ 9 + 7$  取模。
 $n\leq10^5,a_i,b_i\leq2000$ 。
题解
考虑组合意义,相当于横着走  $a_i+ …
Jayun 发布于 2023-11-16 07:39:36
00
树形动态规划(树形 DP)二次扫描 / 换根法
题意
在一棵树上,边有边权,给定  $k$  个特殊点,对于每个点  $i$  求,从  $i$  出发必须经过所有特殊点的最短路径长度(可重复)。
 $n,k\leq10^5$ 。
题解
不能直接对 dfn 排序然后线性做因为不对。
考虑树形 DP,答案就是从  $i$  出发到每个有点的儿子一来一回,最终减去最长链,也可以跑到父亲那里,换根即可。对于最长链,有时需要次长链更新。
const i …
Jayun 发布于 2023-11-15 20:21:26
00
模拟退火
退火。
const int N = 1e3 + 5;
inline ll Read() {
	ll x = 0, f = 1;
	char c = getchar();
	while (c != '-' && (c < '0' || c > '9')) c = getchar();
	if (c == '-') f = -f, c = getchar();
	whil …
Jayun 发布于 2023-11-15 16:39:38
00
树形动态规划(树形 DP)二次扫描 / 换根法计数
题意
给出一棵大小为  $n$  的树,和两个值  $p,q$ ,求有多少个四元组  $(a,b,c,d)$  满足路径  $a\rightarrow b$  的长度是  $p$ ,路径  $c\rightarrow d$  的长度是  $q$ ,且两路径不交。
 $n,p,q\leq3000$ 。
口胡
考虑容斥转化问题为求交的。交有两种情况,两条路径的 LCA 都是同一个点;一条路径穿过另一条 …
Jayun 发布于 2023-11-15 08:10:28
00
Link Cut Tree (LCT)Splay
板题,只放代码。
const int N = 3e5 + 5;
inline ll Read() {
	ll x = 0, f = 1;
	char c = getchar();
	while (c != '-' && (c < '0' || c > '9')) c = getchar();
	if (c == '-') f = -f, c = getchar();
 …
Jayun 发布于 2023-11-14 21:40:39
00
