2023.8总结

Day 1

T1

n,m<=1000

RT

注意到只能往右或往下走,所以一个操作改变的对于一条路径来讲必为连续的。
所以考虑DP。
设 $ f(i,j)$ 为走到 \(i,j\) 最小需要进行多少次操作
得 :

\[f(i,j) = min\begin{cases} f(i-1,j) (此位为0)\\ f(i,j-1 ) (此位仍为0)\\ f(i,j-1) + 0/1(左边是否为0)\\ f(i-1,j)+0/1(上边是否为0)\\ \end{cases} \]

$ O(nm) $,可过。

T2

$ \sum_{}{n} \le 200000,T \le 5$
似乎是我第一次考场切紫题
注意,度数为1的节点为叶子节点,所以找根的时候要注意,不能直接取1为根。
先考虑是否能用树形DP。
由于每个节点上都有度数,清掉一个非叶子节点度数有两种情况,一是 \(LCA\) 为自己的两个叶子节点相连,二是 \(LCA\) 为自己祖先的两个叶子节点相连。
由下往上,可确定出每个儿子节点第二种情况只有多少种,在求出自己的第二种情况。
无解即为连第一种答案都满足不了或根节点仍需比他更大的 \(LCA\) 删除。
此题过。
突然觉得好水

T3

题意:给出一个 \(n\) 个点 \(m\) 条边的有向图,求将一条边反向后强连通分量数目是否改变
$ n \le 1000,m \le 200000$
混20暴力tarjan求强连通,思考如何AC。
若两点在同一 \(SCC\) 里,若一点只有一条路径到另一点,则反向之后 \(SCC\) 个数变化,否则不变。
若不在同一 \(SCC\) 若一点到另一点只有一条路径,反向后不变,否则变化。
怎么求一条边上两点只能通过此边连接呢?
只需先对这个点做2次dfs,一次沿着正着边表,另一次沿着反的边表,若两次 \(dfs\) 到另一点深度都为1,及只有一条,否则多条。
证明:题目保证无重边,若有多条路径,两次必有一次不会通过这条边到另一点。
所以做完 \(SCC\) 后 , 每个点都做2次 \(dfs\) ,时间复杂度 \(O(nm)\) 可过。

T4

???

Day 2

T1

题意:一个长度为 \(n\) 序列,初始时一个位置上有1,每次可以将一个长度不超过 \(k\) 子串对称,有一些位置上不能放1,最终求一些位置上换几次能到此位。
$ n\le 100000 $
可以打SPFA,每个点连向可以换到的位置。
由于能到的位置可能很多,跑SPFA会超时。
考虑优化。
由于一个节点只能去一次(边权为1),所以考虑用 \(set\)
每次二分 \(set\) 区间,再遍历,每次删掉已遍历的点。
可过此题。

T2

题意:给出一个由"?","(",")"组成,'?'可替换成'('')',问有多少个子串合法?
首先,若一个子串长度为奇数必然不可能,所以要为偶数。
考虑将所有'?'替换成'(',直到一个子串内'('个数比')'少时,才可以不合法,可以求出一个子串最多能往右扩展多少。
将'?'替换成')'同理。
\(i\) 最多到左到 \(p_i\) ,到右到 \(q_i\)
\(j \le i\)
有 :

\[\begin{cases} (j-i)为偶数\\ p_i \ge j\\ q_j \le i\\ \end{cases} \]

\(i,j\) 奇偶性分两次处理,每次查找对于 \(i\) , \(j \le i\)\(p_i \ge j\) , \(q_j \le i\)的个数
时间复杂度 \(O(nlogn)\)

T3 T4

??

Day3没了

Day 4

T1

考试的时候一眼莫反了。
求数对 \((x,y)\) 中 x与y不互质且 \(gcd(x,y) \neq x,y\)的个数
莫反模板啊

T2

题面:
为帮助捕获在逃的犯人, 警局引进了一套新计算机系统. 系统覆盖了N 个城市,有E条双向的道路。城市标号为1 到N. 犯人经常从一个城市逃到另外一个城市. 所以警察想知道应该在哪里设置障碍去抓犯人.计算机系统需要回答下面两种类型的问题:

  1. 考虑城市A 、B; 如果把连接城市G1和G2的那条公路切断,逃犯还能从城市A逃到城市B吗?
  2. 考虑三个城市A、B 、C. 如果把城市C封锁(则不能从其他进入城市C),逃犯还能从城市A逃到城市B吗?
    你的任务是帮计算机系统回答这些提问。(一开始,任意两个城市都是可以相互到达的).

这道题似乎是我第一次做圆方树。
问题1很好解决,边双缩点后看 \(g1,g2\) 在不在 \(x,y\) 的路径上。
问题2呢?圆方树
将点双后点双新开一个点,每个点连向对应的点双。
这样就可以跑 \(LCA\)

T3

题面:
无线传感器网络由n个独立的设备(编号从0至n-1)和一个控制中心(编号是n)组成。每个设备都必须能够将其传感器读数发送到控制中心,但是由于范围的限制,并非所有设备都可以直接与控制中心通信。为了解决这个问题,每个设备都分配有一个父亲,它可以直接向其父亲发送数据。父亲可以是另一台设备或控制中心。每个设备都从其所有儿子设备(如果有的话)接收读数,并添加自己的读数,并将所有内容传递给其父设备。所有读数必须最终到达控制中心。设备拥有的儿子数量称为该设备的负担值。整个网络的负担值是其所有设备中的最大负担值。务必注意:控制中心不是设备。
为了描述设备与设备之间(不是跟控制中心通信)的能否通信,给出二维邻接矩阵 edge[0..n-1][0..n-1],如果第i个设备可以直接将数据传输到第j个设备,则第i个元素的第j个字符等于'Y',否则为'N'。无线传感器网络是有向无环图,因此,如果设备d1可以直接或间接向设备d2传输数据,则设备d2不能直接或间接向设备d1传输数据。
再给出一个数组C[0..n-1],其中C[i]='Y'表示第i个设置可以直接与控制中心通信,'N'则表示不能。
你的任务是为每个设备指定一个父亲(父亲可以是设备,也可以是控制中心),设第i个设备的父亲是fa[i],使得整个网络的负担值最小。
输出fa[0]至fa[n-1],如果答案不唯一,输出字典序最小的fa[0]至f[n-1]。
如果无法完成任务,输出-1。

如果是负担值是子树中节点个数的话,可以拆点后跑网络流,可是是负担值是儿子个数。
怎么做?
事实上,拆成二分图后还是网络流。
将每个点拆成入点与出点,出点在左边,入点在右边,每条边连两点的出点与入点。
可以二分答案出每个点最多子结点个数,超级源点连向每个出点的流量即为二分所得。
每个入点连向超级终点的流量同理。
网络流可行性判断。

T4

?

Day 5

T1

题意:可以选取任意物品,每个物品选取有截止时间与价值,一个时间只能选一个物品,求价值最大?
$ n \le 2000000 ,\sum_{}{a_i},\sum{}{b_i} \le 10^9$
贪心
按截止时间从大到小排序,每一个都放进优先队列里,每个时间弹出一个价值最大的物品。
注意,要不能枚举时间,要看时间差。
复杂度 \(O(nlogn)\)

T2

多重背包 ?

T3

线段树裸题 ?

T4

?

Day6

T1

我见过最难的T1吧
题意:给一个长度为 \(n\) 的序列,求 $ A<B<C<D,a_A \times a_B \times a_C =a_D $的个数

\(n \le 10^5,a_i \le 1000000\)

一眼没思路

\(n^4\)的做法很简单,暴力枚举即可
\(n^3\)也一样,因为 \(a_i\) 不大,可以记录,任意存一个即可。
\(n^2\)则就从中间分开,枚举前面,枚举后面,求答案即可。

T2

这不是推销员吗?

T3

题意:\(n*m\) 个点,每次可以让 $\forall i,(a,i)与(b,i) $相连或 $\forall i,(i,a)与(i,b) $相连,每连一条边有代价 \(v\) ,求最小代价?
混分做法肯定是最小生成树 \(Kruskal\),考虑如何优化。
由于 \(Kruskal\)是按边权排序,所以同一组的边肯定排在一起。
考虑如何一次做一组的边呢?
由于求最小节省,所以考虑的是那些原本就连在一起的,或者是在前一条边做时连上的。
原本连在一起的可以用并查集维护,对于后一种,由于做了后保证完整一行或一列联通,所以只需要计数另一种操作进行了多少次即可,因为若已经连在一起,只需要做一次即可。
统计答案后输出,线性时间复杂度。

T4

?

Day 7

开始猜结论了

T1

题意:一个图,开始将一些边染成黑色,若一个点与其他点相连的边中,若仅有一条不为黑色,将此条染成黑色,求使所有边为黑色的开始最少染多少条边。

首先,染黑可以视为删去此边。
考虑极限,一棵树肯定是可以直接删完的,而多加一条边肯定不行。
所以结论出来了,删的点数即为 \(m-n+1\)
注意,题目未保证联通,所以要每个连通块处理

T2

题意:交换相邻两个数,使最终序列满足一个山峰形。

如果先将最小的数移动至最左或最右,那此数将会与后面操作无关,序列将缩减。
贪心找出最近是移动到最左还是最右。
如何找出最左/最右距离呢?
如果一个数要放到左边,那么对它的步数有影响的只会是对左边比他大的数。
右边同理。
做树状数组就好了。
时间复杂度 \(O(nlogn)\)

T3

首先,若把每次(u,v)操作看成连一条边,那么最终连边肯定是一棵树,所以我们可以预处理出来。

考虑如何计算答案。

若一个v合并到u上,那么原v的方案数不变,原u的方案数乘2。
那么做 \(dfs\) 序后树状数组就好啦。

T4

?

Day 8

第一次AK

T1

一个变换看成一条边,即为找环或链。

T2

神奇的背包

T3

emm…… 考虑离线,静态处理。 一个查询我们只需要知道开始时在帽子里是那个小球,结束时那小球在哪 思考一下就可以数组模拟了

T4

有点水
一道 \(LCA\) 维护的东西有点多的模板题

Day 9又不见了

Day 10

T1

可以考虑以一个点为k,最左可以到哪,最右可以到哪
维护ST表,内做GCD,即查询一段区间的gcd是否整除于 \(a_k\)即可
二分查找左右边

T2

题意:给出一个集合,求其非空子集的和的中位数

对于一个集合 \(a_1,a_2,a_3,......,a_n\) 和为 \(k\) ,容易发现若有子集 \(a_k,a_{k+1},a_{k+2}......\) 的和为 \(m\),必有另一子集和为 \(k-m\)
所以序列对称。
中位数必定在平均数的后面那一个。
\(bitset\) 优化DP,找出来即可即可

T3

一道与动态数对点很像的CDQ

T4

??

Day 11

T1

emm……
很有趣的一道构造题
让最左下角的始终保持白,可确定先后手胜负

T2

题意:求 \(1 \le i \le n\) 中,\(i\) 中没有连续的3个1的个数。
原题?
考虑 \(f_{i,0},f{i,1},f{i,2}\) 分别表示做到第 \(i\) 个,开头没有1,一个1,2个1的个数。
可得:
\(f_{i,0}=9 \times(f_{i-1,0}+f_{i-1,1}+f_{i-1,2})\)
\(f_{i,1}=f_{i-1,0}\)
\(f_{i,2}=f_{i-1,1}\)
求出递推式,套矩阵加速,最后用总情况减去即可。

T3

题意:给出一些点,动态加点,每次询问给出一点坐标,求离此点曼哈顿距离最小的点。
又是原题?
这不天使玩偶吗?
由于曼哈顿距离有绝对值,将绝对值拆开分类讨论。
4种情况。
考虑在左下角的点对自己的贡献。
即为二维偏序。
因为有修改,为三维偏序。
做4次 \(CDQ\) 即可。

T4

题意:给出一个无向图,有修改与查询操作,每次删掉一条边或查询两点之间的割边。
又又是原题
删边容易改变树的结构,倒着考虑。
最后的形态可进行缩点,割边数为两点距离。
而加上一条边后两点间的就不存在割边了。
可以将每条边设权值为1,每次修改将一段设为0。
树链剖分,维护区间赋值,区间求和的线段树即可。

Day 12

有趣的倒序开题
T1不见了

T2

题意:给出一个 \(n\) 个节点的树,每次删除一个节点以及它的子树,求恰好删 \(i\) 次有多少种方案数,\(i \in [1,n]\)\(n \le 5000\)
由于要求方案数,又有恰好删多少次,考虑树形 DP。
\(f{i,j}\) 表示第 \(i\) 个节点的子树删 \(j\) 次的方案。
即时一个树上背包了。
预处理出组合数,每次遍历完子树时乘上组合数放进背包里。
预处理组合数时间复杂度 \(O(n^2)\) ,树形 DP 时间复杂度 \(O(n^2)\)
可过这道题。

T3

题意:给出一个 \(n\)\(m\) 边的有向无环图以及一个数 \(v\),每条边有边权 \(e_i\) 与 长度 \(l_i\) ,求选出一条路径,满足长度和最大,且路径内相邻两条边的权值异或和 \(\le v\)\(n,m \le 2 \times 10^5,w,v\le 10^9\)
有向无环图上可以跑拓扑排序,考虑如何满足异或的限制。
可以想到 \(01trie\)
每次遍历到一个节点时建出一棵字典树,向外扩展时利用字典树更新答案。
时间复杂度 \(O(nlogv)\) ,可过。

T4

题意:给出一个 \(n \times n\) 的网格图,每个点指向右或上的一个位置,第 \(n+1\) 行与 \(n+1\) 列有权值,每个点能到它指向的位置,可以继续走下去,每次能改变一个点的指向,求每次的权值和,\(n\le 5000\)
由于每个点只能指向一点且不可能指回自己,可以建树。
每次修改其实只是改变一个子树的位置,可以暴力转位置后向上加上/减去改变的权值。
时间复杂度 \(O(n^2log^2(n))\) ,每次输出答案即可。

Day 13

只能写T1了

T1

题意:给出一个三维空间,有些点不能走,求从 \(x=0,y=0\) 的平面到达某点的最短距离。
反向考虑,从目标点开始 \(bfs\) 即可。

T2

??

T3

??

T4

??
Day 14 不见啦

Day 15

T1

题意:给出 \(n\) 个数 \(a_i\),求选出尽可能多的数使得选出的数中每两个数相加都不是质数,\(n \le 750\)
很明显,我们可以预处理出哪些数相加是质数,选择的时候直到有哪两个数不能同时选。
对于两个不同时为1的数,若他们加起来是个质数,那么和大于2,即是奇的质数,所以两个数奇偶性肯定不同。
根据这个性质,我们可以构建二分图,左边是奇数,右边是偶数,对应连边。
所以就是找最大独立集。
跑网络流或匈牙利算法,拿 \(n\) 减去就可以得到答案。

T2

题意:给出一个 \(n \times m\) 的网格图,每个点上是空或水晶或炸弹,炸弹可以横着或竖着爆炸,消除掉行上或列上的水晶,并且引爆行或列上的炸弹,开始可以选择一个炸弹并选择方向引爆,求最多能炸掉多少水晶(\(n,m \le 3000\))。
贪心,发现若横着引爆炸弹后再连锁引爆时横着炸,明显不是最优,所以肯定时横竖交替这样炸的。
综上所述,我们可以枚举每一个点,引爆对应的炸弹,重复的点不在搜索,找出最大值。
时间复杂度 \(O(nm)\) ,可过这道题。

T3

??

T4

??

Day 16

T1

题意:给出一个长度为 \(n\) 的字符串,每次两人从左边或右边选取一个字符加到自己的字符串的最后,最后谁的字符串字典序大谁赢,\(n\le5000\)
一道很经典的博弈论。
\(f_{i,j}\) 表示字符串在区间 \([i,j]\) 内是先手必赢,后手必赢,或是平局。
若存在先手无论选那边,后手选择的比自己大,或是后手最优选择后剩下的区间是先手必败,先手输。
若存在先手选一边,后手无论选哪边都小于自己,或是剩余区间是先手必胜,先手赢。
否则,平局。
复杂度 \(O(n^2)\) ,可过。

T2

??

T3

??

T4

??

Day 17

T1

题意:给出 \(n\) 个序列,第 \(i\) 个序列有 \(m_i\) 个数,每次A可以从任一序列左边选一个数,B可以从任一序列右边选一个数,问最后谁选的和最大?
考虑 \(m_i\) 全是偶数的情况,容易发现,一方选了一个数后,另一方可以对称地选择,直接选掉另一端的一个数,这样,A选的数会在序列的左端,B选的数在右端。
统计答案直接加即可。
那有奇数呢?
很简单,谁先选了这个序列,那不变回偶数序列了吗?
那A与B怎样选择序列会最优呢?
不难发现,第一个选择只是多拿了中间那个数。
所以将所有的奇数序列按中间数的大小排个序,A与B贪心选择即可。

T2

题意:给出一个 \(n\)\(m\) 边有边权的无向图,多次询问,第 \(i\) 次询问给出 \(m_i\) 个关键点,找出一个子图,使得子图中这 \(m_i\) 个点联通且子图中最大的边权最小,求最小为多少,\(n\le 100000,m \le200000,\sum m_i \le 200000\)
由于它让最大边权最小,可以考虑 \(kruskal\) 重构树。
有 $ \sum m_i $ 可以考虑虚树。
\(kruskal\) 求出最小生成树,建出重构树,每次询问按照 \(dfn\) 序排序,询问最大值最小多少,即两两 \(LCA\) 可解决。

T3

??

T4

??

Day 18

T1

??

T2

题意:求 $ \sum_{i=0}^{n} ( a^{i} + b^{i} + c^{i} )^k $ , \(k \le 5000\)\(n \le 10^9\)
\(( a^{i} + b^{i} + c^{i} )^k\) 拆开
得 $ \sum_{x=0}^{n} \sum_{y=0}^{n-x} C(n,x) C(n-x,y) (a^i )^x (b^i )^y (c^i )^{n-x-y} $
变成 $ \sum_{x=0}^{n} \sum_{y=0}^{n-x} C(n,x) C(n-x,y) (a^x )^i (b^y )^i (c^{n-x-y} )^i $
所以原式就是 $ \sum_{i=0}^{n} \sum_{x=0}^{n} \sum_{y=0}^{n-x} C(n,x) C(n-x,y) (a^x )^i (b^y )^i (c^{n-x-y} )^i $
调换一下 \(\sum\) 位置,变成 $ \sum_{x=0}^{n} \sum_{y=0}^{n-x} C(n,x) C(n-x,y) \sum_{i=0}^{n} (a^x )^i (b^y )^i (c^{n-x-y} )^i $
而 $ \sum_{x=0}^{n} \sum_{y=0}^{n-x} C(n,x) C(n-x,y)$ 与 \(i\) 无关,所以 $ \sum_{i=0}^{n} (a^x )^i (b^y )^i (c^{n-x-y} )^i $,可以直接求出。
观察发现, $ \sum_{i=0}^{n} (a^x )^i (b^y )^i (c^{n-x-y} )^i $ 可变成 $ \sum_{i=0}^{n} (a^x b^y c^{n-x-y} )^i $ 为等比数列,所以可以用等比数列求和公式 \(O(logn)\) 求出。
枚举 \(x,y\) ,分别累加答案。

T3

??

T4

??

Day 19

T1

大模拟再见

T2

题意:给出一个长度为 \(n\) 的序列,将其划分成 \(k\) 个区间,每个区间的价值为区间内每个数的最大值减去最小值,求 \(k=1,2,3......n\) 时,总价值最大多少,\(n \le 5000\)
直接求解不方便,不如这样思考:选出 \(k\) 个区间,代价为里面选一个数减去另一个数,这样最大的答案等同于题目要求了。
可以很轻易的用 \(DP\) 写出来,\(f_{i,j,0/1/2/3}\) 表示对于第 \(i\) 个位置,已划分了 \(j\) 个区间,并且第 \(i\) 个数在当前区间啥也不是/作为减数/作为加数/两个都是。
转移很容易,\(n^2\) 能过。

T3

题意:\(n\) 个人,每个人有权值 \(a_i\)\(|i-j|=|a_i-a_j|\) 的人才可以在一起,问最后全部人能不能都在一起。
首先,\(|i-j|=|a_i-a_j|\) 转化为 \(i+a_i=j+a_j\)\(i-a_i=j-a_j\)
观察到每个人只能选一种转换方法,所以构造二分图。
枚举 \(1\) 至 $ n$ ,将左侧的 \(i-a_i\) 与右侧的 \(i+a_i\) ,连一条边。
这样的话,就是每条边可以给一个端点的权值 \(+1\) ,且最后每个点权值为偶数。
只需要每个连通块内的边数为偶数即可。

T4

??
Day20没了
The end

posted @ 2023-08-29 21:34  dijah  阅读(19)  评论(0编辑  收藏  举报