CSP-S模拟赛6 总结
CSP-S模拟赛6 总结
波波又给题换皮。
还行,有科技不会。
T1 跳火山(\(30pts\))
赛时
\(n^2\) 走人。
正解
整除分块板子,不会的科技。
T2 赞美太阳(\(0pts\))
赛时
想到了可以 AC 自动机上矩阵快速幂优化 dp,但觉得矩阵维护不了 \(\text{min}\) 遂润。
正解
AC 自动机上广义矩阵快速幂优化 dp,怎么又是因科技而亖啊。\kk
T3 幽邃主教群(\(66pts\))
这题要水估值写详细点
赛时
吃的最饱的一集,第一档 \(n^2\) 暴力维护即可。
第二档只有查询可以把查询离线一下排序后把只统计 \(\ge b\) 的转换为了把 \(< b\) 的删掉,排序后就不会加回来了,然后再把初始的人也排序一下,使用双指针和一个很聪明的技巧可线性解决,具体见代码。
//好吧其实排序才是瓶颈
sort(q+1,q+1+m,[](s x,s y){return x.v<y.v;});//查询排序
sort(c+1,c+1+n,[](s x,s y){return x.v<y.v;});//初始的人排序
int cnt=1,ant=1;
//vis[i] 表示 i 是所处组的几个端点,即:
// vis[i]=1 表示 i 是组端点
// vis[i]=1 表示 i 所处组只有 i 一个点
vis[1]=vis[n]=1;
for(int i=1;i<=m;i++){
while(c[cnt].v<q[i].v&&cnt<=n){//便利要删的点
ant+=1-vis[c[cnt].id];//不是端点多一组,是端点不变,独自成组少一组
vis[c[cnt].id+1]++;//如果不是端点那左右两边就成了端点,如果是端点那会让左/右边继承,如果独自成组那什么也不会发生
vis[c[cnt].id-1]++;//这个是不会加到别的组的因为组与组直接都会至少隔一位
cnt++;
}
ans[q[i].id]=ant;
}
正解
如果按照第二档往下想显然是带修莫队的样子,只需再添加时间一位,可惜赛时没想到,因为懒得写所以这里不给出代码。
教练给的官方正解是考虑每个相邻二元组 \((A_{i-1},A_i)\) 对询问的贡献是对所有 \(B_j \in (A_{i-1},A_i]\) 的答案加一,于是我们只需要一个在值域 \(10^9\) 的范围内实现区修单查的数据结构。
我这里选择动态开点树状数组,但 stl 自带的哈希表太慢了,遂手写。
T4 整理(\(20pts\))
赛时
瞎 jb 打了一个双向 dfs 就能骗 20,高兴。
正解
拆贡献,另 \(dp_{i,j,k}\) 表示在第 \(i\) 位,前面有 \(j\) 个数要与后面匹配,目前怪异值为 \(k\) 时的方案数。
然后就有转移:
\[i\text{与自己匹配:}dp_{i,j,k}+=dp_{i-1,j,k}
\]
\[\text{两者都与后面匹配:}dp_{i,j,k}+=dp_{i-1,j-1,k+2i}
\]
\[~~~~~~~~~~~~~~~~~~\text{两者都与前面匹配:}dp_{i,j,k}+=dp_{i-1,j+1,k-2i}\times(j+1)^2
\]
\[\text{两者一前一后匹配:}dp_{i,j,k}+=dp_{i-1,j,k}\times2j
\]

浙公网安备 33010602011771号