讲课记录

Update on 7.18 好像初步完工了!!!

写的很简单,后面在完善。

D1 dp (lyc)

凸性:ppt

边际效应:对应着决策单调性,两个东西,同时加上一个东西,多的东西加的多。

二维的边际效应:四边形不等式,就是两条一长一短的线段,同时加一个东西,给长区间加一个东西,比给短区间加一个东西代价更大。

四边形不等式能推出决策单调性和完全单调性

2D/1D: 形如 \(f_{k,i} + \omega(j,i) \to f_{k+1,j}\),假设 \(\omega(j,i)\) 满足决策单调性。我们有一个分治做法,能做到 \(O(n k \log n)\),对于一个区间 \(\left[l,r\right]\),我们找到中点 \(mid\),暴力计算,接着直接分治,只不过有决策单调性,可以不用遍历完。

课上讲的是 CF1603D。

完全单调性:对于任意 $ 𝑖<𝑗 $,在一个前缀中从 \(𝑖\) 转移更好,在一个后缀中从 \(𝑗\) 转移更好。

二分队列:

状态设计技巧:在最优化问题中,一个常用的方法是:
先设计一个取值为 0/1 的状态,然后利用单调性去掉一维。

举例子:CF1870E

如果某个转移区间能被其他东西替代,那么不优。

也可做上面那道题。

还有一个 CF1768F。

WQS二分:


dp 设计原理:感觉是状态设计。

课上的例题好像忘了( 这个

但是实际上是这样的:我们写考虑判定,再将判定的变量加入 dp。

例题:UOJ748,有点抽象啊

dp of dp:判定换为 dp,一般状态不会多。

一些奇怪的状态:Gym103466I(状压的东西不太正常)
ABC225F(邻项交换法,倒序),CF1810G(和前面差不多,wzy 讲的)

这里是题解

CF1603D

每一步都很自然的 *3000。

根据上课讲的东西,决策单调性显然,注意到 \(\log_2(k) \geq n\) 时直接能构造出为 \(n\) 的解,然后套用分治即可。还需要一些数论技巧。

CF833B P5574 CF868F

根据上课讲的东西,决策单调性显然。算是三倍经验了。

P1912

二分队列。

AT_abc225_f

Sol

CF1810G

在dp选讲写了。

P8321

在dp选讲写了。

CF1870E

有意思题目,第一种做法就是设 \(dp_{i,j}\) 表示 第 \(i\) 项的答案是否能为 \(j\),让他成为 0/1 dp。把单调的一维设为状态。所以是 \(dp_{j} = i\)。类似于 dijkstra 转移即可。第二种是转移优化,直接因为本题中,只有极短 mex 区间是有用的。即,若 \(\left[𝑖,𝑗]=[𝑖−1,𝑗 \right]\),或 \(\left[𝑖,𝑗\right]=\left[𝑖,𝑗−1 \right]\),那么这个区间就是无用的。这样的区间只有 \(𝑂(𝑛)\) 个。

证明看看第一篇题解,多头上课没证明出来。(

UOJ748

考虑如何判定这个东西,我们如果能匹配就匹配了,如果不能匹配,我们就直接,让前面的数当做插入的,保证合法就行。

能我们只需要设 \(dp_{v,x,y}\) 表示已经匹配了长度为 \(v\) 的前缀,插入了 \(x\) 个 0,\(y\) 个 1。转移不难。

2019 ICPC Nanjing 区域赛 I(QOJ7063)

先考虑 \(1\le a_{i} \le 50\) 怎么做,我们有一个直观的想法就是对达到的点进行状压。显然不对。但是我们真的需要这样做吗,我们只需要把到达的点的权值进行状压就行了。直接把这个东西的哈希值放在状态里面就行了。对于权值 \(\geq 50\) 的情况,我们是不是直接乘上一个组合数进行了。对于 \(0\) 的情况也是同理。

P10141

有一个 \(O(n^4)\) 的 Dp,设 \(dp_{l,r,x}\) 代表在 \(\left[l,r\right]\) 的这个区间,\(x\) 能留下来的概率,这个不好,我们反着做,设 \(dp_{l,r}\) 代表为 \(\left[ l,r\right]\) 这个区间能留下来的概率,是 \(O(n^3)\) 的,这个题后面的部分没有意义就不写了。

P2224

P3188

CF1768F

GYM102538H

D2 math (lsy)

?

前面是为后面符号做铺垫。直接贺 PPT 吧。

上午讲的直接贺 PPT 了。疑似太形式化了。


前面是一些 Tricky 东西

后面是容斥原理,二项式反演,子集反演。

贺了一个图

DAG容斥:?,容斥系数的推导。

GF:讲的东西有点 Trivial。

这里是题解

P4159

分层图,然后做完了。

P10143

考虑算贡献,分两种情况, 太简单了,没啥好说的。

P7961

经典永流传属实了,直接设 \(dp_{i,j,k,l}\) 表示 目前从低到高确定了第 \(i\) 位,目前确定了 \(j\) 个数,目前 \(1\) 的个数为 \(k\),上一位进位了 \(l\)的所有答案,考虑怎样转移,就是转移到 \(dp_{i+1,j+t,k+(l+t) \bmod 2,l+ \left\lfloor \frac{(l+t)}{2} \right\rfloor }\),现在来确定一下系数,注意到贡献是乘积的形式,所以可以乘上 \({n-j \choose t} v_{i} ^ t\),然后就做完,注意下最后算答案的时候处理一下进位合不合法。

P5664

怎么还是经典题,先考虑容斥,不看最后一条限制,答案是 \(\sum\limits_{i=1}^{n}(1+\prod\limits_{j=1}^{m} a_{i,j}) -1\),有一个经典的观察是最多只有一种主要食材不合法,直接枚举它,我们设 \(dp_{i,j,k}\) 表示前 \(i\)项,不合法的选了 \(j\) 个,合法的选了 \(k\) 个。是 \(O(nm^3)\) 的。注意到当且仅当 \(j-k \geq 0\) 时才能算贡献,直接把后面那一坨换成差值就可以了,是 \(O(nm^2)\),可以通过。

AT_arc154_e

不是题目难度差距巨大啊。

怎么感觉这个题不难

需要一点注意力。

\[\begin{aligned} Ans & =\sum_{i<j} [P_i>P_j] (j-i) \\ &= \sum_{i} \sum _{j>i} (-i) [P_i < P_j] + \sum_{i} i \sum _{j<i} [P_j > P_i] \\ &= \sum _{i} i \left({\sum_{j<i} [P_j > P_i] - \sum _{j>i} [P_j < P_i]} \right) \\ &= \sum _{i} i \left({i-1 - \sum _{j} [P_j < P_i]} \right) \\ &= \sum _{i} i \left({i-1 - (p_i-1)} \right) \\ &= \sum _{i} i \left({i-p_i} \right) \\ &= \sum _{i} i^2 - i{p_i} \\ \end{aligned} \]

前面 \(i^2\) 项对原来的贡献就是 \({n+1 \choose 2}^m\),乘起来。

后面不好算,考虑期望乘上总方案数, 就是\(E\left[\sum\limits_{i} i{p_i}\right] = \sum\limits_{i} p_i \times E\left[pos_{p_{i}}\right]\)

上面那一步有点牛,因为他是排列。

首先没又换过的概率就是 \((1-\frac{(n-i+1)i}{\frac{n(n+1)}{2}})^m\),期望位置为 \(i\)

我们考虑一个点 \(i\)。通过一次操作把它挪到点 \(j\) 的方案数显然是 \(\min(i,n−i+1,j,n−j+1)\)

注意到 \(j\)\(n-j+1\) 本质相同,所以我们期望是 \(\frac{n+1}{2}\)是不是很牛。概率从前面的减就可以了。

那我们就做完了。

AT_yahoo_procon2019_qual_e

权值和是奇数就是异或和为 \(1\) ,考虑线性基。

我们假设选出了一些行,异或后的序列为 \(B_1,B_2,\dotsb B_m\)

我们想知道有多少个子集异或为 \(1\),注意到 \(\forall B_i\)\(B_i \in \left[0,1\right]\)。我们构造出来线性基,显然是 \(1\),对于剩下的 \(m-1\) 个数,对于 \(2^{m-1}\) 可能的情况,都能构造出来他们为 \(1\),所以就是 \(2^{m-1}\),但是对吗?如果我们序列所有数都为 \(0\),那不就炸了吗。考虑容斥,我们把每一列的数凑起来看成一个整体,问题变为了一个序列 \(C_1,C_2,\dotsb C_n\)。我们要选出来有多少个子集异或为 \(0\)。那不就是线性基吗,把所有数加进线性基,答案就是 \(2^{n-线性基大小}\)。还是一样的道理,线性基内可以构造,外面任选。那们一共就有 \(2^n-2^{n-线性基大小}\) 种合法的,再乘上 \(2^{m-1}\) 可能的情况就行了。

总结:线性基是极大线性无关组的性质一般都是题目的突破口。

感觉挺深刻的。

P3265

不就是线性基板子吗,注意到线性基是满足拟阵的。

P4570

从大到小排序,线性基板子。

P3292

我不会告诉你我是树剖+线段树过的

现在看来直接倍增就可以了,对的对的。

AT_abc223_h

不难。

P4151

有趣,老题新做。

我们注意到如果只有一条路径,那们答案直接就是 \(dis_{n}\),不妨考虑的时候借助生成树,分析每条非树边怎么加进去。我们注意到有一个环的情况,就是异或的时候加上环上一圈的异或值,那么所有的情况是同理的。我们把所有环找出来做一遍线性基即可。还有一个问题,我们到 \(n\) 的路径不止一条,但是我们是高贵的线性基,所以就是对的!!!

还是一句话:线性基是极大线性无关组

版本T0相关

实际不全是。

AT_tokiomarine2020_e

P3349

上面两个都是子集反演。感觉不难。

[CEOI 2019] Amusement Park

经典题*1

我们发现对于一个合法的 DAG,若可以通过原图操作 \(x\) 次得到,我们也可已通过 \(m-x\) 得到一个反向的合法 DAG,那们变成了一个计数 DAG 个数问题,再乘个 \(\frac{m}{2}\) 就是答案。

第一次做大概率做不出来的,这里直接说怎么做。注意到数据范围很小,考虑一下状压,设 \(dp_{S}\) 点集为 \(S\) 时的答案,对于这一类问题,我们有一种通用的想法,我每一次考虑将一个互相独立的点的集合加入转移,如下图所示:

我们直接这样转移即可。

但是有问题啊,会算重!!!

还是上图的例子

不难发现一个被算了很多次,我们直接容斥,如果互相独立的点的集合为奇数令他的贡献为正,否则为负。

写出来长这样:

\[f(S)=\sum_{T \subseteq S} (-1)^{\left|T+1\right|} f(S-T) \]

找一个互相独立的点的集合可以这样:

rep(i,1,m){
    int a,b;
    cin>>a>>b;
    G[a]|=(1<<(b-1));G[b]|=(1<<(a-1));
}
ok[0]=1;
rep(s,0,(1<<n)-1){
    rep(i,1,n){
        if(s&(1<<(i-1))&&!(G[i]&(s-(1<<(i-1)))))    ok[s]=ok[s-(1<<(i-1))];
    }
}

子集你肯定知道是 \(O(3^n)\) 的。

贺一个题解的话就是:钦定零度点集,简单容斥去重。

ABC306Ex

经典题*2

考虑没有等号怎们做,不就是上一个题吗?

那我们只需要考虑有等号的情况就行了,这个不就等价于缩点吗,预处理所有可能的情况,用并查集维护一下联通块大小,和上一个题没有区别。

拉插优化dp

难点在于想到拉插,可以看看这一篇是如何找到次数的。

省流:差分!!!

lsy给的题不多,经典题还是自己找一找。

Day 3 树上ds,图论相关 (lsy)

最开始有点 Trivial。

前面东西总结一下:

  1. 尽量使用基本的技巧,转化为经典问题
  2. 根据信息结构的强弱,使用不同的东西维护。
  3. 倍增维护等幂信息,这个只需要不漏,树上差分要想的起来。

重剖:candy。

长链剖分:我好像写过一点,但是还有优化 dp。

线段树合并:今天主要不是基础,是线段树合并优化 dp。
其他的总结是线段树合并+树上差分可以做到“在恰当的时刻拥有想要的信息”

还是写一下优化 dp 吧。

要满足一些条件,有用的值是 \(sz\) 个,并且后面那一坨是一堆相乘的形式。实际上是整体 dp。

dsu on tree:本身简单,今天讲的题有点抽象,一个 Trick 是枚举 LCA。


最小生成树:我们不一定要用,主要是 3 种求法的思想各有各的用处。

生成树相关构造与 dfs 树:dfs 树具有不存在横叉边的性质。

点双:圆方树,不解释/wx。

强连通性:今天学会了 kosaraju !!!,对于正图dfs,记录出栈时间戳,在反图从大到小 dfs。

耳分解

双极定向

2-SAT:今天的技巧是将 \(X_{i,j}=[a_i\le j]\) 作为条件。

欧拉回路:dfs,回溯时加入当前点。

这里是题解。

CF888G

考虑 Boruvka,注意:这一种题目中,我们往往只是借鉴了它的思想。

我们逐位进行考虑,对于在 \(w\) 这一位中,我们将 \(0\)\(1\) 的分开考虑。

我们在一侧的 root 上面直接套用经典做法找到异或最小值,然后将 \(0,1\) 两侧的树合并即可,注意到这样的话权值还要加上 \(2^w\)

CF1364D

把 dfs 树建出来,至于相关的东西,在图论杂题写过。

无向图 dfs 树是没有横插边的。

如果能找到合法环就找,不能直接找独立集。正确性显然。

Public Judge Round 3, A

考虑 Boruvka,我们对于中间的点,只能向上或向左连一条边,然后将最外面的边直接连起来。

UOJ176

Boruvka。

P8820

111

P4577

课上讲的是dsu on tree (记得哪天写一下这个)

我们考虑 dp,设 \(dp_{i,j}\) 表示 以 \(i\) 为根的这一棵子树,此时的选的最小值为 \(j\)

有以下转移

\[ dp_{i,w_i} =1+\sum\limits_{}{dp_{v,\geq w_i}} \\ dp_{i,j}=\sum\limits{dp_{v,\geq j}} \]

第一个正常的对每一个节点开一颗线段树,直接往上转移。

第二个考虑线段树合并优化,因为没怎么写过所以写的比较详细。

对于两颗线段树 x 和 y,我们进行分类讨论。

可以画图更有助于理解

维护 \(x\) 右边的 \(\sum\limits{dp_{v,\geq j}}\),叫做 \(maxp\) ,另外一侧叫做 \(maxq\)

1.\(x=0,y=0\) 直接返回。

2.\(x=0,y \neq 0\) 直接给 y 上的节点区间加 maxp。

3.\(x \neq 0,y = 0\) 直接给 x 上的节点区间加 maxq。

4.\(x \neq 0,y \neq 0\) 线段树合并上去。

int y1=t[rs(y)].val,y0=t[rs(x)].val;
ls(x)=merge(ls(x),ls(y),l,mid,max(maxp,y0),max(maxq,y1));
rs(x)=merge(rs(x),rs(y),mid+1,r,maxp,maxq);

对于左子树,我们要加上右子树的那一坨东西。

这个题对对于右子树,不需要管。

最后 dp 过程大概是这样的

void dfs(int u,int fa){
    int val=1;
    for(int i=h[u];i;i=g[i].nxt){
        int v=g[i].v;
        if(v==fa)   continue;
        dfs(v,u);
        val+=query(root[v],a[u],Lim,0,Lim);
        root[u]=merge(root[u],root[v],0,Lim,0,0);
    }
    modify(root[u],0,Lim,a[u],val);
}

P5298

转移是这个,我们只需要维护前缀和,后缀和,我们考虑线段树合并优化 dp。

1.\(x=0,y=0\) 直接返回。

2.\(x=0,y \neq 0\) 直接给 y 上的节点区间乘 maxp。

3.\(x \neq 0,y = 0\) 直接给 x 上的节点区间乘 maxq。

4.\(x \neq 0,y \neq 0\) 线段树合并上去。

int merge(int x,int y,int sumx,int sumy,int pbmax,int pbmin){
    if(!x){mktag(y,sumx);return y;}
    if(!y){mktag(x,sumy);return x;} 
    pushdown(x),pushdown(y);
    int x0=t[ls(x)].val,x1=t[rs(x)].val,y0=t[ls(y)].val,y1=t[rs(y)].val;
    ls(x)=merge(ls(x),ls(y),(sumx+pbmin*x1)%mod,(sumy+pbmin*y1)%mod,pbmax,pbmin);
    rs(x)=merge(rs(x),rs(y),(sumx+pbmax*x0)%mod,(sumy+pbmax*y0)%mod,pbmax,pbmin);
    pushup(x);return x;
}

CF1697F

难点在于想到2-SAT。

Trick:将 \(X_{i,j}=[a_i\le j]\) 作为条件。

CF1583H

你管这个叫 *3300?

第一问从大到小加入,用并查集维护。

第二问就则略微不同,我们考虑如何合并两个集合,如果最大值不相等直接并查集完事,如果相等,我们可以在两边的集合中取 max,但是还有中间的东西,但我们只需要求最大费用就可以,所以随便找一条路径,取一个最大值就行了。这种做法相当于建了隐式的重构树

长链剖分的题

看到我记得让我催更

连通性相关题目

看到我记得让我催更

Day 4 ds lyc

是不是最开始没讲的部分才是最有趣的

最开始就是经典的矩阵规约。多头是不是讲的有点水

四毛子: 实际上是 log 分块。

这里只有 +1-1RMQ。

我们取一个阈值 \(B\),一共有 \(\dfrac{n}{B}\) 个块,然后对于整块直接维护 \(\dfrac{n}{B}\) 个ST表,这个是 $ O(\dfrac{n}{B} \log \dfrac{n}{B})$ 的。

实际上,我们研究一下本质,实际上我们要解决的问题是,如果两个点在一个块里面,我们如何求出最值,因为不在一个 块时,维护前后缀就可以了,我们需要充分利用好性质,对于长度小于等于 \(B\) 的长度,我们注意到一共只有 \(2^{B}\) 种可能,总的复杂度是 \(O(B 2^B)\) 的。令 \(B= \frac{\log n}{2}\) ,此时是线性的。

\(𝑘\) 叉树 是不是还是有点魔怔了,我是不是直接可以取 \(e\) 的到理论最优复杂度。

接下来并不是 PPT 上的内容。

我们考虑维护 ds 我们要干什么。

1.信息的性质,例如结合律,以及前几天 feecle 讲课提到的那些。

2.靠近经典问题。

3.在线,离线,注意:这个和我们平常说的强制在线之类的是有区别的。,真正的在线的东西只有二分,但是好像不止吧,好吧实际上还有自动机的构造,例如莫队指针的偏移,我们需要查询一些信息,用来统计答案,这些东西显然不是强制在线的,所以我们在离线把这些信息处理,这就是所谓的“二次离线”。

4.势能,看下面。撤销:e.g. 可撤销并查集,线段树分治,回滚莫队。

根号分治:今天讲的题目难点不在于这个,之前有过总结就不写了。


势能分析:这应该是比较正(che)统 (dan)的。

经典问题:区间开根,区间和。

sol:我们的势能是区间 max。每一次向下开根,都会变小很多。

同样是经典问题:区间开根,区间和,区间加

sol: 令势能 \(\sum \log(\log |a_i-a_{i-1}| +1)\)

不要看上去很吓人,实际上很多都是类似形式。

1.若势能为 0,即区间所有数相同,实际上还要特判极差为1的情况,无须递归下去开根;

2.若递归下去开根了,区间的势能至少 −1;

3.每次区间加,势能增加是 \(𝑂(\log \log n)\) 的。

所以只需维护区间是否相同。

减半报警器:。

这里是题解

莫队二离

模板题

首先暴力莫队过不去。

我们考虑将 $\left[L,R\right] \to $ 其他地方的贡献算上。

\(\left[L,R\right]\)\(x\) 的贡献记作 \(g\left(L,R,x\right)\)

  1. $ \left[L,R \right] \to \left[L,R+k\right] $

就是求对于在 \(\left [R+1,R+k \right]\)\(x\),求出 \(g(L,x-1,x)\)

差分之后就是 $g(1,x-1,x) - g(1,L-1,x) $,前面的东西,我们可以直接算出来,而后面的东西,我们再次离线,就像这样给他打上一个标记

g[L-1].push_back({R+1,q[i].r,-i});

同理我们可以写出整个过程。

P3350

dp选讲写过了。

P8564

树上背包,我们可以采用上下界优化,做到 \(O(n^2)\) 的复杂度。

区间推max/min

维护最大值,次大值,最大值次数。

Day 5 flow,分治 (lsy)

原来的 blog 写了一点基础问题。

上午的题目非常的有意思。

CF1250K 这个题告诉我们一些事情,我们可对于网络流问题,我们第一个点是找到一个非常容易的数学模型,第二个是对于一个结论,可以猜测必要性推测充分性。

CF1684G 这个题也是找到一个非常容易的数学模型,如果找到了这个题建二分图是非常自然的事情。

P4003:费用流入门题目,注意力惊人。

Primal Dual 算法:实际上是势能 dijkstra,可以看看以前写的。

费用流问题,每一单位流量的最短路长度单调不减。

最小割的实质:假设 \(x_i\) 表示 \(i\) 是不是和 \(S\) 在一边,则目标就是最小化

\[\sum_{i,j} val(i \to j) \times (x_{i} and \lnot x_{j}) \]

注意:问题只能转化成这种形式,否则是 NP-hard的

题目非常有意思,后面放上来。

模拟网络流,费用流

P5470:模拟费用流入门题。
建图之后要大力分类,感觉挺抽象的。


下午的题目还是很有有趣的,感觉 PPT 写的很详细,等我做了在放上来。

这里是题解。

我好像有些不会做。

CF1684G

好题。

我们考虑怎们构造,因为这个和上课内容无关,所以我们直接写了。

对于 \(t_i \leq \dfrac{m}{3}\),直接构造 \((3m,2m)\) 就可以了。

对于 \(t_i > \dfrac{m}{3}\),最优秀的构造是 \((2p+x,p+x)\),其中 \(p> \dfrac{m}{3}\)\(x < \dfrac{m}{3}\),这个代表对于一个 \(p\),至少需要一个 \(p\) 去与它匹配,还要只产生这两个数。判断一下是否同余。然后建立二分图跑一个二分图匹配就行了。

P8215

最小割模板题目。

变量是什么:每个人参与或者不参与,每个团队愿意或者不愿意。

对于第一个限制。直接 \(S\)\(i\)\(d_i\)\(i\)\(T\) 连去 \(c_i\)

真的按上课那个套路感觉没什么难度,懒得写了。

P3227,P6054

别急。

P4313

把所有贡献减去最小割。

真的按上课那个套路感觉没什么难度,懒得写了。

AT_arc142_e

前置:二分图最大权独立集:求二分图最大权值和的独立集。

先设 \(x_i\) 表示 \(i\) 选不选,然后把一边的变量取反。

伟大,无需多言。

这个是真的困难。

我们实际上的限制是

\[\max(A_x,A_y) \geq \max(b_x,b_y),\min(A_x,A_y) \geq \min(b_x,b_y) \]

后面那个拆开之后实际上是

\[A_x \geq \min(b_x,b_y),A_y \geq \min(b_x,b_y) \]

直接调整就可以了。

切糕和一些 2-SAT 的题目告诉我们我们题目的变量可以是形如 \(X_{i,j}=[a_i \leq j]\) 的东西是可以作为变量的。我们尝试直接做,但是条件是 \((\lnot x_{i} and \lnot x_{j})\) 并不能直接做,所以这个题做不了

观察一下,如果有一个下界已经 $ \geq \max⁡(𝑏_x,b_y)$ 就不用考虑了。

如果没有了,这个限制意味着什么,我么要让其中一个东西大于$ \geq \max⁡(𝑏_x,b_y)$,这个东西好像对于一组限制,就已经是二分图,对于左侧的,就是 \(a_i<b_i\),另外一侧是 \(a_i \geq b_i\),我们直接转换成为 \((x_{i} and \lnot x_{j})\),好了这个就是二分图的形式。

不要急,我们还没有考虑每一个变量的限制。

有一个显然的东西是$i+1 \to i $ 连接 INF。

不是剩下的都很显然啊,不写了。后面就是上课讲的基础东西。

AT_arc125_e

Link

CF1442D

有意思的。

我们注意到最优的选择一定是只有一个没有选完,其他的都选完了。

暴力 dp 是枚举只有一个没选完的点 \(x\),将 \(1,2,3,\dots x-1,x+1,\dots,n\) 加入 dp,这个是 \(O(nk^2)\) 的。

考虑分治,solve(l,r) 这个东西表示已经将 \(\left[1,l-1\right] \cup \left[l+1,n\right]\) 的东西加入了背包,那对于 \(solve(l,mid)\),我们只需要将 \(\left[mid+1,r\right]\) 加入背包,回溯是回退即可。

solve(l,l) 就是答案。

P7482

没有意思题。

直接暴力维护 \(4\) 个 dp 数组,分别为左端点可以选或一定不选的的独立集,右端点可以选或一定不选的的独立集。然后分治算贡献就行了。

P4755

最值分治,很有趣的套路,如果贡献和最值相关,我们直接对最值进行分治,每次只需要枚举小区间,算它对大区间的贡献,感觉你可以叫他启发式分裂。

P5654

以后我一定要学会线性求笛卡尔树!!!

考虑将询问拆开,我们以左端点为例,对于 \(\left[l,r\right]\) 这个点,从\(\left[w+1,r\right]\) 来的的贡献不改,只需改另外一侧就行了,只需要ds维护就行了。

P9058

遇见树上路径问题,考虑点分治。

那们直接转化为 \(dis_u+dis_v\) 就是对的,但是这样的点对太多,很多都没有用,他们可以被其他东西偏序掉,这个东西就叫做支配对。

在这个题目中,我们只需要找到他们的前后继就行了,一共只有 \(O(n \log n)\) 个,用单调栈维护,最后是一个类似二维数点的形式,代码并不难。

P5979

feecle:这个题很简单,我们就不讲了。

P2305

出栈序+李超线段树套线段树

CF1373F P6122 P3826 P4214 P3980 CF1427G CF1666K P1792 CF2029I

还没有看。

Day 6 纸糊串

我会哈希,你会吗。

内容和这个高度重合,看看这个吧。

posted @ 2025-06-26 21:25  q1uple  阅读(27)  评论(0)    收藏  举报
1