二〇二三模拟赛
9.22
时间安排
7:40~7:50
看完A,没意识到勾股定理,第一时间的想法是解方程组
7:50~8:05
看了B,想到可以反向加边,但是没想到最远距离一定是到直径端点的距离,想了很长时间怎么合并,不会
8:05~8:15
看了C,感觉这个题可以骗
8:15~8:20
D只会暴力
8:20~8:40
先写了B的60pts部分分,然后重新想A
8:40~9:10
打表后发现这东西和直角三角形有关,第一反应用\(O(1)\)素性判断做
9:10~10:40
开始嗑C的骗分,把自己能想到的稍微有点正确性的都给写上了
10:40~11:00
又去看了B,觉得可能会有数据结构能够维护,但还是不会
11:00~11:20
写完D的暴力,考虑了一下数位DP,发现不会做
11:20~11:40
检查了一下,然后坐等结束
反思总结
- 对已学知识点理解不够好
题解
A
发现和直角三角形有关,推式子得到 \(b^2=\frac{a^2-1}{2}, c^2=\frac{a^2-1}{2}+1\),然后考虑一下\(a\)为偶数的情况
B
并查集+直径的维护
C
骗过去的
D
一个特殊的性质,\(f(10^{18}+n)-f(n)=n\),利用这一个就能确定 \(solve(l,r)\) 的 \(l\) , \(r\) , 具体的就是考虑,\(solve(1,10^{18})=81\times10^{18}+1\),假设 \(solve(1,10^{18})\%a=p\),那么答案就是 \(solve(1+(a-p),10^{18}+(a-p))\)
9.24
时间安排
8:00~8:40
看题,除a没有会的
8:40~9:20
写完a
9:20~12:00
一直看b,想差分约束,然后坐牢
总结
- 智力感觉有所下降
- 认真看题面
题解
A
n遍dijkstra,然后建图,再跑dijkstra
B

#include <bits/stdc++.h>
#define mod 998244353
#define ll long long
using namespace std;
ll C[3005][3005],fact[3005];
void init()
{
C[0][0]=1;
for (int i=1;i<=3003;i++)
for (int j=0;j<=i;j++)
{
if (i==1 || j==0) C[i][j]=1;
else C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
fact[0]=1;
for (int i=1;i<=3003;i++) fact[i]=fact[i-1]*i%mod;
return;
}
void add(ll &x,ll y) {x+=y; x%=mod; return;}
ll dp[3005][3005];
int suml[3005],sumr[3005];
int m,n,l,r;
int main()
{
init();
cin>>m>>n;
for (int i=1;i<=m;i++) {cin>>l>>r; suml[l]++; sumr[r]++;}
for (int i=1;i<=n;i++) suml[i]=suml[i-1]+suml[i],sumr[i]=sumr[i-1]+sumr[i]; // 左区间 <=i 的人数(不一定覆盖到i), 右区间 <=i 的人数
dp[0][0]=1;
for (int i=0;i<n;i++) // n 个 拍卖品
for (int j=0;j<=m;j++) // m 个人
if (dp[i][j]) //前i列,有j个R未满足
{
l=suml[i+1]-suml[i]; //第 i+1 列有多少个左区间的端点,一定需要在这里被满足的左区间
r=sumr[i]-j; //之前满足了这么多个右区间
int rr=sumr[i+1]-sumr[i]; //这第i+1列一共有这么多个右区间的左端点
int lef=i+1-r-suml[i]; //现在前面还剩下lef个列可以选
if (lef<0) continue; //如果lef<0没可能
//case1:这列选给了一个R
if (j+rr>=1 && lef>=1) add(dp[i+1][j+rr-1],dp[i][j]*(j+rr)%mod*C[lef-1][l]%mod*fact[l]%mod);
//case2:这列没选给一个R
if (lef>=l) add(dp[i+1][j+rr],dp[i][j]*C[lef][l]%mod*fact[l]%mod);
}
cout<<dp[n][0]<<endl;
}
C
打表发现 \(0\sim2^k-1\) 中二进制表示下有奇数个 \(1\) 的数(下面统称为 \(odd_k\))和有偶数个 \(1\) 的数(下面统称为 \(eve_k\))个数相同,严格证明考虑数学归纳法:
证毕
更进一步的
可以得到任意 \(0\sim2^{c_1}+2^{c_2}+...+2^{c_n}\ (c_i\not=0)\) 的 \(eve\) 和 \(odd\) 相等,所以只需要特判是否含有 \(2^0\)
剩下的只需要用做区间恢复,然后统计 \(odd\) 和 \(eve\) 然后成起来就是答案,用线段树维护即可
D
首先,每个人都是独立的,也就是说,可以分开求每个人的期望
每个点被选的概率相等,当选了 \(x\) 个点时,概率就等于 \(\binom{n}{x}\),再考虑求一个点对被选中的概率
对于一个固定的点对 \((a,b)\),其出现次数就相当于同时选了这个点对对应的 \(a\) 和 \(b\),剩下的点随便选,也就是 \(\binom{n-2}{x-2}\)
那么对于这个点对,被选中的概率就是
最后答案就是 总的满足条件的点对数量\(\times\)固定点对被选中的概率 得到的就是选中点对的期望
现在已经求出 固定点对被选中的概率,对于 总的满足条件的点对数量 可以直接点分治 \(O(nlogn)\)求得
10.06
时间安排
7:40~8:10
看完四道题,A,B都有点思路
8:10~8:40
A感觉可以直接线段树,于是码了一个线段树,大样例竟然一遍过了,对剩下几题感觉更有自信了
8:40~9:50
B感觉区间DP能做,于是推了很长时间式子,刚开始没意识到要用组合数,以为自己式子推错了,打算写个暴力出来,看看哪步转移不对。结果发现暴力不太好打,然后干脆就继续想哪里错了,9:50左右意识到需要组合数
9:50~10:20
补上组合数,然后又调了一阵子,大样例终于过了
10:20~11:10
C看着是有性质的,于是开始推,发现只要 \(2\times 2\) 的小矩阵满足就行了,因为时间不够了,于是就直接开码暴力
11:10~11:30
感觉D有思路,写出来之后不对,没调出来。在想D的时候,C突然就有思路了,想到它可能是交替的,但没有往下想,主要没想到C这么好写,当时感觉不太好实现
反思与总结
-
感觉C可惜了,主要B写的时间太长,没思考全面
-
感觉比较好的是,今天上午比较清醒,可能是和早晨早起了半个小时有关
10.13
7:40~8:10
看完题,t1很有思路,t2能贪,t3应该能做,但是不好写,t4想到了转移,但是不对
8:10~8:50
发现自己t1的做法需要维护的东西很多,于是狠心写了一个线段树和树状数组
8:50~9:40
t2感觉不难,好像直接贪心就行,没发现什么反例,于是很愉快的写完了
9:40~10:50
不知道为什么特别困,可能没睡好,做t3的时候有点不撑了,不过还是想到一个递归的构造方式
10:50~11:10
写完发现不对,然后惊喜的发现,棋子可以走八个方向,而我写的是四个方向的,gg
11:10~11:30
把自己构想的t4转移写完,然后果然不对。
总结与反思
一场下来,节奏差,还困,犯错多,不清醒,特别是当把t1、t2都写完时,有点不想想了
最难绷的还不是t1被卡了,最难绷的是t2原数组乘二了,线段树数组没乘二,100->45
考试意识不好,对题目难度估不准,把简单题做难,然后写代码问题多,总是忽视代码最基本的,像是数组大小,开不开longlong,哪里应该开longlong,哪里的边界应该是什么样的
其实我t4的转移挺接近的,但是想的太少了,也没时间往下想了
状态是对的,但是转移不全
这样想这场比赛还是有很多点是可以发挥的,但是没发挥出来
10.14
题解
t1 贪心+DP
t2 贪心+数据结构
t3 类似分形的构造
t4 计数DP
7:50~8:20
看完四道题,性质有点多,感觉这场不太好打,t1应该是并查集,t2应该就是个贪心
8:20~8:40
写完t1
8:40~9:40
t2写了很多种贪心方式,其中有一个是对的,有一个骗写挂了,导致后来wa了4个,其他的点因为写了个线段树全T了
9:40~10:20
Day 1
kitty
核心思路:将转移过程中的方案加入转移矩阵,边转移边累加
string
dp设计:\(f[i][x][y]\) 表示长度为 \(i\),第一段以 \(x\) 结尾,且 \(x\leqslant p\),第二段以 \(p\) 开头,以 \(y\) 结尾的两段完全相同的序列的对数。
对于每个 \(p\) 答案就是 \(\sum_{i=1}^{n}i\cdot f[i][x][y]\times 2^{max(0,p-x-1)}\)。
加个前缀和优化可以做到 \(O(n^4)\)。
优化:\(i\) 这维在转移的时候并没有用到,可以考虑将这维优化掉。设 \(g[x][y]\) 表示第一段以 \(x\) 结尾,且 \(x\leqslant p\),第二段以 \(p\) 开头,以 \(y\) 结尾的两段完全相同的序列的长度和。
那么当 \(s_x=s_y\) 时,就有转移:
容易进行 二维前缀和优化,时间复杂度为 \(O(n^3)\)
contact
类似 \(Kruskal\)
Day 2
decimal
注意到除法的借位类似于取模后 \(\times 10\)。
所以这道题可以考虑通过 \(\times 10\) 取模快速到达小数点后第 \(L\) 位,然后暴力求即可。
labor
二分区间长度,然后求区间内逆序对个数即可。
具体的,对于长度为 \(len\) 的区间,先删去 \(i-len\) 的贡献,然后再加入 \(i\) 的贡献。
这个过程用树状数组维护即可。
distance
考虑当节点存在一个 子树大小 \(>n/2\) 时,那么它必定不是优秀的。因为可以通过移动这个点,使 \(\sum_{1\leqslant v\leqslant n,v\not=u}dis(u,v)\) 更小。
综上得到第一个性质:这个点必须是重心。
对于一个点 \(u\),要使它成为重心,需要让它的每个子树的大小都 \(\leqslant n/2\)。
到这里就可以直接考虑暴力的 换根dp,不过还可以继续对题目进行挖掘。
发现只有 \(rt\)(重心) 对应的 \(u\) 的子树个数是 \(>n/2\) 的,直接分类讨论即可。
worship
简述一下题意:求 \(1\sim n\) 所有排列产生的贡献的和,每个排列的贡献是 \(\prod_{i=1}^{n-1}dep[lca(p_i,p_{i+1})]\)。
观察式子发现,产生的贡献实质上是连续段合并产生的,也就是说可以直接考虑连续段dp。
对于 \(u,v,w\) 三个点,\(u\) 为 \(v,w\) 的祖先,\(v,w\)分别在 \(u\) 的两个子树里,产生贡献的情况只有:
这三种情况。设状态为 \(f[u][i]\),表示 \(u\) 的子树中,有 \(i\) 个连续段的答案,\(g[k][i][j]\) 表示将 \(i,j\) 个连续段合成 \(k\) 个连续段的方案数。
再考虑 \(g\) 的转移。也是三种情况。
对应到式子上就是:
然后对斜线进行前缀和优化即可,时间复杂度为 \(O(n^3)\)。
Day 3
gameone
对于每一格。如果是红色,说明当前行比当前列染得靠后;如果是绿色,说明当前列比当前行染得靠后。
直接对每行每列加个标号,然后对每个格点建边,最后跑 \(TuoPu\) 判是否有环即可。
count
枚举 \(p\),然后注意一下边界,直接组合计数即可。
tease
可重集完全错排问题。
反演不会,但是可以直接硬容斥。设 \(f[i][j]\) 表示考虑了 \(i\) 种数,有 \(j\) 个数不符合限制。
brackets
将 "\((\)" 看成 \(1\),"\()\)" 看成 \(-1\),那么对于一个合法的括号序列就相当于所有前缀的和非负。
直接线段树维护即可。
Day 4
literary
正如题目一样。
考虑第一次如何注水,发现最多注 \(\frac{l+1}{2}\)。假设 \(l=5\),如果我一次注 \(4\),宙斯此时说 \(k=6\),那么另一个海域只能再注 \(2\),导致两个海域的差值 \(>1\),因此不行。
第二次注水考虑让总水量补满 \(l\),然后再一边降两滴。(举例:\(3\) \(4\) -> \(5\) \(4\) -> \(5\) \(6\),在这个过程中,所有经过的可能总水量,都满足两大海域只差 \(\leqslant 1\)。)所以第二次给另一海域降水量为 \(\frac{l+3}{2}\),因为一边两滴也是从这个海域开始的,可以把两次降水合并起来。之后每次一边降 \(2\) 滴即可。
math
贪心。
只需知道区间内 \(1\) 的个数、只有一种质因子的数的个数(下面统称质数)、出现次数最多的数字就可以求出答案。用主席树维护即可。
具体的:
- 当这个区间有 \(1\),没有合数(有至少两种质因子的数),只有一种质数时,不合法;
- 出现次数最多的数字出现 \(len/2\) 大于等于,可以把其他质数全部消掉;
- 出现次数最多的数字出现 \(len/2\) 小于,那么区间内所有质数肯定可以两两配对消掉或者余一个;
geography
首先对于一个边双内的点,肯定是可以相互到达的,直接缩点。问题变成一个树上问题。
相当于链标记,一个向上或向下的标记,判断两个标记是否同时存在即可。
标记可以树剖也可以树上差分。
history
只会离线做法。

浙公网安备 33010602011771号