目录
题目链接
传送门
题目
A题
思路
签到。
代码
#include
#include
B题
思路
打表找规律。
代码
#include
#include
C题
思路
看样例猜。
代码
#include
#include
E题
思路
初始时联通快有\(n\times m\)个,由于在每次进行操作之后重新数联通块比较复杂,因此我们可以将思路转换一下,变成每次操作后联通块减少了\(x\),那么答案就是\(n\times m-x\)。
我们可以发现每次增加一条新的横线(前面没有对这一行进行操作)后联通块减少了\(m-1\)个,每次增加一条竖线后联通块减少了\(n-1\)个。
我们假设横线数目为\(h\),竖线数目为\(w\),那么当只有横线时答案为\(n\times m-h\times(m-1)\),当只有竖线时答案为\(n\times m-w\times(n-1)\)。当既有横线又有竖线时需要稍微容斥一下,因为对于交叉点我们会重复减掉,因此需要加回来,被重复减掉部分为\((h-1)\times(w-1)\),此时答案为\(n\times m-h\times(m-1)-w\times(n-1)+(h-1)\times(w-1)\)。
注意同一行被操作多次只能被算一次,因此我们可以考虑用左闭右开线段树来维护。
代码
#include
#include
H题
思路
由于查询时保证\(r-l\leq 2\),因此我们可以用三个树状数组分别存下以\(i\)为左端点,区间长度为\(0,1,2\)的区间被哪些区间覆盖过。
插入时对于\([l,r]\)的每个数作为左端点区间长度为\(0\)的均有被覆盖,\([l,r-1]\)为左端点区间长度为\(1\)的均有被覆盖,\([l,r-2]\)为左端点区间长度为\(2\)的均有被覆盖,分别进行\(update\)即可。
代码
#include
#include
J题
思路
我们考虑当前\(dfs\)到结点\(u\),从\(1\)到\(u\)的父亲结点得到的答案为\(sum\),那么\(f_u=sum+u\)的贡献。
当\(a[u]\)在\(1\)到\(u\)这条链上是第一次出现时,此时\(u\)的贡献为这条链上不同数的个数;
当\(a[u]\)是第二次出现时,此时\(u\)的贡献为上一次\(a[u]\)出现位置到\(u\)的路径上不同数的个数\(+1\),这个\(1\)表示的有序对是\((a[u],a[u])\)。
当\(a[u]\)出现次数大于\(2\)时,此时\(u\)的贡献为上一次\(a[u]\)出现位置到\(u\)的路径上不同数的个数。
在回溯的时候记得清除\(u\)造成的影响。
代码
#include
#include
K题
思路
我们将\(a\)做个前缀和,然后考虑每个\(b\)的贡献即可。
代码
#include
#include