做题记录高一上联考
2022年
10月26日 周三
线
每个粒子会相撞,求最右边粒子活到最后的概率
dp有几个粒子会往右,最右边粒子直接打穿
配
分治,对于二进制下每一位进行分治处理
10月27日 周四
诗
求:$\sum^{len}_{i=1}x_i\times w^{len-i}$
在dp时翻倍计算,当前增加的值在下一次翻倍会重复计算,计入:cut
10月30日 周日
汉谟拉比
每只五哥有一个值,你将一个数分成$N$分,然后随机分配,求被咬的概率
这里,分配过程互不影响,那么对于一个数$x$,分到$k$只五哥头上会被咬,则期望加上$k \over N$
10月31日 周一
浑数
一个埃氏筛板子,埃氏筛枚举质数筛是:$o(NlnlnN) ;大概就;5N$
iidx
$if \quad i=1\quad f[i]=s[i]\$
$else\quad if(s[i]==1)\quad f[i]=f[i-1]+1\$
$else \quad f[i]=f[i-1]*t$
这东西很骚,最终式子可以写成$y=kx+b$,那么用线段树维护$k,b$
$y=kx+b$这东西可以用矩阵维护线性递推,在线段树上,具有结合律
11月2日 周三
似曾相识
对k二分,场切
送快递
数轴上两个人,一些点,选择一人那物品$i$,问两人走的最短路程
$dp[i][j]$ 表示一人在$i$,一人$j$,的最短路,然后再$i$的人走到最优
水杯
提到结论题,结论是每个柱子的高度差除开和第一棵柱子都是可行方案
这里我们用$bitset$优化,开一个大小为值域的数组,从右往左第$i$表示方案$i$是否可行,$+1$可以表示为<<$1$
10月3日 周四
树哈希
用栈维护节点的出入
删点
树形dp,维护删掉当前点及其子树的代价
上升子序列
每次在序列中随机选择一个为选择过的数,如果当前序列不是上升子序列,终止 问期望步数
这里我们发现每次操作的点是无序的,因此我们无法从左到右进行拓展,可以从中间往左右进行拓展,$dp[i][j]$表示选择了端点$i$和端点$j$,然后只选中间的方案数,我们枚举左右拼接端点进行期望$dp$
10月7号 星期天
画
选择有个点,删掉起点值,要求最小,差分
Gray
老实说,这道题到现在还有点不懂。。。
10月11日 周四
多项式开方
$x^2+2x+1$推出$x+1$
这里我们可以确定原序列的$x_1$,既然最大的已知,那么我们可以通过最大的求出次大,次次大
$$
a_1{d_1}+a_2+...=(x_1+x_2+...+x_N)(x_1+x_2+...+x_N)
$$
对于$a_2^{d_2}$,可以是
$x_2x_2$,$x_1x_3$,对于$x_2x_2$的情况,我们需要在$x_1*x_3$之前将他删除,可以使用优先队列
11月14日
树的道理
对于每个节点染色,一人黑,一人白,若有黑子周边无白字,先手胜
这里,我们要检查每个节点,可以从下网上减,减到负数为先手
括号序列
对于每个左括号,要求其有括号距离为$[l_i,r_i]$,求最终方案数
AC自动机
怎么说,AC自动机这东西,还是特别妙的,对于fail指针,好像讲错的人还不少
令当前节点为$now$,$fail[now]$指向的节点为$x$,则$root->now$的一部分后缀等于$root->x$的全部
还有,当前节点没有儿子的时候,指向失配父亲的那个儿子,这东西很骚啊,就没有博客涉及,当失配时,我们假定他有这个儿子,那么在接下来的下一次失配时,fail指向的时上上个,从而避免其指向根节点
AC自动机优化:
当我们在记录贡献的时候,是一直跳$fail$,直到到达根节点,这里可以打标记,然后从下往上更新,一路火花带标记
瘟疫
对于一个序列,选择一些点,对于每个被选的点,都可以选择任意相邻的点,要记录选择的点的贡献
这个东西试求最大字段和,不连续。。。
首先缩点,+-+-+-,然后有些正数不选,肯定绝对值最小,负数同理,不选的数,和左右合并,权当删掉,每次时间复杂度$\times {1\over3}$,$O(N)$,
11月16日(1,2)
max
给你一个序列,每个数两个元素$x,y$,$val\in[x,y]$,求两两匹配的$max|x-y|$
说是要你匹配,其实是整体讨论,最终肯定是一半r,一半l,$ans=\sum_i^{N/2}r_i-l_i$
我们先全部记录为$r_i$,则当其变为$li$时,我们需要付出代价为$r_i+l_i$,贪心最小
狼人
找出所有的连通块,要求其中的一种颜色$sum_{ci}\times 2>size_{连通块}$,在一棵树上找,$N\le3000$
这里对每一种颜色分开讨论
$f[i][j]$表示到$i$位置目标颜色减去非目标颜色为$k$,这里我们数组肯能遇到负数,所以
const int MAXN=3e3+3;
int f[MAXN][MAXN];
int *F=f[x]+M;
f[0]=f[x][M];
指针妙用
11月17日(改)
LCM
给你一个1到$N$的序列,求出$a[i]\in [l,r]$的$LCM$为$ci$,数据范围$N\le1e18$
长度为 2 的区间 $[x,x+1]$ 的 lcm 就是 $x*(x+1)$,可以二分
长度为 3 的区间 $[x,x+2]$ 的 lcm 在 $x$ 是奇数时是 $x\times (x+1) \times (x+2)$,偶数是还要除以二。
当长度超过三时,区间$r<1.26e6$,所以对于这之前的,我们暴力枚举计算$LCM$,超过的上面
最大团。。。
虚假的最大团,因为任意一个到处子图都会至少有一个点度数小于$k$,$k\le 10$
这里我们按照$k$,从小到达依次找上门,计算完后删除,我们状压一个点可以到达的点和目标点对,一下条件成立为$0$
if(f[i]&(1<<j)&&(f[i]&s)!=s^(1<<j))
方案
$求2{2N} mod \ p$,$\color{red}\ {易错点}$:$2{2N}\equiv 2{2N \ mod \ q-1}(mod\ p)$
kruskal重构树
对于一个图,我们要找所有路径中权值最小的那一条路径中的最大值,首先,路径最小说明是$kruskal$,而最大,我们就重构一下,对于每次合并的两个$x$,$y$,建一个新点$now$,$w[now]=e[i].v$
性质
1、它是一个二叉堆
2、若边权升序,则它是一个大根堆
3、任意两点路径边权最大值为$Kruskal$重构树上$LCA$的点权
2023年
ARC154
A
和定,差大,积小
B
删掉S开头,放入S任意一个位置,求多少次操作后和T相等
这里随着$i$的增大,在某一个点变成相等,$\color{red}有单调性,二分$
C
两个序列,$A$,$B$,操作$A[i]=A[i+1]$,求是否可以让A等于B,是个环
这里可一以发现,只有B是A的子序列满足要求
D
交互:一个被打乱的$1$到$N$的序列,告诉你$P[i]+P[j]$是否大于$P[k]$,要求你输出每个数的值
首先思考特例$1,\frac{N}{2},N...$
发现$P[i]+1>P[j]$可以推出$P[i]>P[j]$,所以要找$1$
$P[i]+P[i]<=P[j]$,则$i$,更优
过程用归并排序减少比较次数,也可以用$stable_sort()$
ARC153
B
有一个 $H$ 行 $W$ 列的矩阵,矩阵中每个位置都有一个小写字母。每次操作给出 $a,b$,含义是在第 $a,a+1$ 行之间切一刀,再在 $b,b+1$ 列之间切一刀,这样能得到四个矩阵;每个矩阵旋转半周,最后把四个矩阵拼起来得到新矩阵。有 $n$ 次操作,每次形如 $a_i,b_i$,希望输出操作后的矩阵。
$对于x_i,y_i关于a_i,b_i的操作,如果x_i<a_i,x_i=a_i-x_i+1,否则H+a_i-x+1,都mod\ H$
多次操作式子为$a_k-[a_j-(a_i-x+1)+1]+1$
我们可以把和$a$有关的提取出来单独算,那么对于每个点的位置$O(1)$计算
C
给定 $n$ 和一个长度为 $n$ 的序列 $A$,满足 $A_i \in {-1,1}$。
你要尝试求出一个长度为 $n$ 的序列 $x$,满足以下限制:
-
$|x_i| \leq 2 \times 10^{12}$;
-
序列严格递增,即 $\forall 1 \leq i < n$,$x_i < x_{i+1}$;
-
$\sum_{i=1}^n{A_ix_i} = 0$。
如果存在这样的序列,输出 Yes 和一个满足条件的序列 $x$;如果不存在,则输出 No。
这道题,$emmm...$,当我看到数据范围还是很惊讶的,这不是乱切吗?
对于第一个数,降低是可以把后面所有数的正值拖下去的
D
定义 $f(x)$ 为其十进制意义下各位数字之和,比如 $f(1)=1,f(123)=6$。
给定长度为 $n$ 的序列 $A$,请找到一个非负整数 $x$ 使得 $\sum\limits_{i=1}^nf(A_i+x)$ 最小,并输出这个最小值。
$dp[i][j]$表示当前枚举到第$i$位,向前进位$j$个的最小贡献,第一遍计算贡献,第二遍计算向前进位的贡献,当前是第$i$位,按照第$i-1$位排序
2月1日
烤串
$Q$次查询,每次查找一个区间,求区间中回文串数量
对于以每个点为中心的回文串,$logN$可以解决,通过$Hash$二分
对于每个点,是一条线段,查询线段长度,用区间修改主席树,标记永久化
乘积筛
$$
ans=\sum_{1\le x\le N,1\le y\le M,ic+jy=C}a_xb_y
$$
$\color{red}可以用exgcd?得看看$
暴力记忆化
2月3日
饼干
有$n$种饼干,第$i$种饼干有$a_i$块。你需要尽快吃掉这些饼干,但是你吃饼干时必须满足一个特殊限制:
假设你第$i$天吃掉第$j$种饼干$b_{i,j}$块,则$\forall i,2\max_{1\le j\le n}b_{i,j}=\sum_{j=1}^nb_{i,j}$。
构造一个吃完饼干的方案或者报告无解(当你不能吃完这些饼干时)。如果有解,你需要在$\lceil\frac{n}{2} \rceil $天内吃完饼干以得到满分。
被吃完只可能其中最大的不超过一半,对着这个目标选择加上删减
2月10日
选择
选择一些数,要求出现次数最多的等于剩下的,求删除这个序列的最少次数
每次选择最大的数,删到等于第二个,然后从后往前删完,构造题,没什么好说的
原题
给你一个$1e18$的数,和它的欧拉函数,进行分解质因数
$$
\phi(ij)=\phi i \times \phi j \
\phi(ii*j)=\phi i \times \phi j \times i\
$$
2月12日
游戏
一个点的值是到这个点最大的必经边的值
这里引入一个概念$\ \ \ \color{red}支配$
我们记录一个点的最大必经边,从根节点开始往下搜,其中,离根节点的边权不但大而且更有可能合法,这里是贪心
而要一个点背更新完再去其他边,拓扑
数位
找到一个区间异或起来值为$k$的点对数量
$ \color{red}"数位dp,是一种上限低,下限高的题目",lc说。$
首先是固定dp方程设计$dp[i][j][n][m]$,表示到$i$位,有$k$个不同数,$n,m$表示有没有到达上限
转移过程这里有一种
add(f[i][k][0][0],f[i+1][k][1][1]);
add(f[i][k][0][0],f[i+1][k][1][0]);
add(f[i][k][0][0],f[i+1][k][0][1]);
......
共计$8\times 8=64$种转移方案。。。。。。溜了溜了
接下来是正戏
for(int i=30;i>=0;--i) for(int k=0;k<=30;++k)
for(int a=0;a<2;++a) for(int b=0;b<2;++b)
for(int n=0;n<2;++n) for(int m=0;m<2;++m){
if((a&&(x>>i&1)<n) || (b&&(y>>i&1)<m)) continue;
int ai=0,bi=0;
if(n==(x>>i&1)) ai=1&a;
if(m==(y>>i&1)) bi=1&b;
add(f[i][k+(m^n)][ai][bi],f[i+1][k][a][b]);
}
首先,$a,b$是上一个有没有到达界限,$n,m$是当前枚举的值,不合法的情况$if$判掉就行

浙公网安备 33010602011771号