CSP-S 备战所有题题解(week 2)
Day 1
P1373 小 a 和 uim 之大逃离
话说相同不应该都死吗?
看到
定义状态:
表示这一步走到了
方程过于板子了:
dp[i][j][d][0]=dp[i][j][d][0]+dp[i-1][j][(d-a[i][j]+k)%k][1];
dp[i][j][d][0]=dp[i][j][d][0]+dp[i][j-1][(d-a[i][j]+k)%k][1];
dp[i][j][d][1]=dp[i][j][d][1]+dp[i-1][j][(d+a[i][j])%k][0];
dp[i][j][d][1]=dp[i][j][d][1]+dp[i][j-1][(d+a[i][j])%k][0];
——
CF31E Funny Game
由于太像C的TJ了,所以我讲详细一点(以证明我不是C的)。
首先这是道博弈论对吧(要是这都看不出来就。。)
考虑一下,当先手拿和不拿
如果不拿,等于正在处理
如果拿,那么这一步获得的
所以
由于
答案:
CF1006F Xor-Paths
双向广搜,一眼就会。
由于向下走
考虑一下双向搜索,从顶点和终点往对角线的方向搜即可。
Day 2 考试
T1
简述题意:
因为单调不降,所以答案只会从左边和上面两条边转移过来。答案等于
定义
T2
简述题意:求两个字符串的编辑距离,如果大于
编辑距离的 DP 公式原因,在此处不再赘述。定义
对于距离超过
T4
我自己的题解
Day 3
P2279 [HNOI2003] 消防局的设立
贪心题。
如果一个点没有收到消防站的覆盖,那么就在它的祖先处设立一个消防站。从深度最低的往最高的扫即可。
为什么这是最优的?在父亲节点处不是还能照顾到自己的兄弟吗?注意:这个点是目前深度最低的无法覆盖的点,如果祖父盖不到,说明这个点深度一定不是最低的。
每建立一个消防局,扫描两层即可。看起来这是
注意将
for(int i=2;i<=n;i++)
{
cin>>a[i].fa;
a[i].gf=a[a[i].fa].fa;
a[i].dep=a[a[i].fa].dep+1;
a[i].i=i;
G[i].push_back(a[i].fa);
G[a[i].fa].push_back(i);
}
sort(a+1,a+n+1); // 按深度排序
for(int i=1;i<=n;i++) dy[a[i].i]=i;
for(int i=1;i<=n;i++)
{
if(x1[i]||x2[i]) continue;
x1[dy[a[i].gf]]=1;ans++;
dfs(a[i].gf,2);
}
CF893E Counting Arrays
一道很好的计数题喵。
先考虑正负数的问题。因为
这个题一看就要质因数分解。定义:
其中
对于每一个指数
球 盒子 可空? 方案数 相同 不同 可 \dbinom {n+m-1}{m-1} ——by sLMxf
所以对于每一个指数
所以最终的答案为:
分解质因数是
故总的时间复杂度为
Day 4
CF360B Levko and Array
我自己的题解
P9751 旅游巴士
最短路。
首先这题的 二分套分层图 BFS 一眼就可以看出来对吧。
然而交上去荣获
Buy Low Sell High
本题和 CF1974G 很像。
事实证明,像到是一点也不像,但都是反悔贪心。
考虑一种贪心:每次只要能够赚取利益,就从
然而会有这样一种 hack:
3
1 2 114514
显然这个时候拿一个
考虑这样一件事:每一次用从之前拿过的最优解,把最大的替换掉。先考虑拿新的,在考虑拿旧的。
典型反悔贪心。时间复杂度是优先队列的
for(int i=1;i<=n;i++)
{
cin>>m;
if(!q.empty()&&q.top()<m)
{
ans+=m-q.top();
q.pop();
q.push(m); // 再放一个旧的进去
}
q.push(m);
}
附:大型纪录片之《小球进盒子·全篇》
| 球 |
盒 |
可空? | 答案 |
|---|---|---|---|
| 相同 | 相同 | 可 | |
| 相同 | 相同 | 否 | |
| 相同 | 不同 | 可 | |
| 相同 | 不同 | 否 | |
| 不同 | 相同 | 可 | |
| 不同 | 相同 | 否 | |
| 不同 | 不同 | 可 | |
| 不同 | 不同 | 否 |
-
$$f(n,k)=f(n-1,k-1)+f(n-k,k)$$ -