07-29 NOIP模拟测试10
A. 辣鸡(ljh)
看到这题时有点虚,没选化学啊喂。
一开始一直在想对角线有没有什么性质,然后进死胡同了,去看T2。
回来后,想先qj一下点1,然后发现了块内的贡献可以直接算,一开始我用对角线推的,所以有下面这个鬼畜柿子
ans+=1ll*(1ll*(mi-1)*(mi-2)+(mi-1)*(abs(x-y)+1))*2;
后来发现这种算法十分nc,其实有 $ans_{块内}= \sum\limits_{i=1}^{n} 2 \times (x2_i-x1_i) \times (y2_i-y1_i)$ ...
接着开始考虑怎么统计各个块之间的,看到N的范围,这板比不能$ \Theta(n^2) $ 啪
所以一直在想 $\Theta (nlogn)$ 的log哪来的,那么就想用些数据结构什么的来维护边界信息,还有离散化什么的emmm。
然而正解就是大暴力$ \Theta(n^2) $,但其实是不到的,因为有一个显然而有效的剪枝和极其水的数据(过于分散的块)
我们对所有块按x1为第一关键字,y1为第二关键字排序,然后我们规定每次算i和i之后的块,这样保证了不重不漏
对于边界可以先算正对的部分,就是 $2 \times (接触线长-1) \times (2-1 )= 2 \times (接触线长-1)$,然后对多出且有贡献的两端缝缝补补。
剪枝:当i的x2+1够不到j的x1时,后面的j不可能对i有贡献,break掉
B. 模板(ac)
测试点分治:
1~6 节点套set,不断向上找father,在其路径的所有点上加入c,用siz判断即可。$ \Theta (nmlogm) $
7~14 发现没有容量限制,所以就变成了《雨天的尾巴》。注意毒瘤出题人,c有负数,要离散化。
正解:DSU on tree
就是树上启发式合并,说白了就是每次更新把小的怼到大的里。
然后我们要给 大 小 一个定义,类似树链剖分,我们区分轻重儿子。
对于每个节点u,每次更新我们保留其重儿子的线段树,然后暴力把轻儿子的贡献加到线段树里。
在u上传给fa时若u不是fa的重儿子,就用懒标记清空线段树(注意不能用memset,复杂度退化)
复杂度证明在蓝链里。
C. 大佬(kat)
看到期望就把我唬住了,虽然看出是求方案的套路也没去推,难度评估错误。
一开始我想对于一种方案,在i移动的时候是有k天的制约的,就是有k-1天是不变的,所以要把k天的状态留下来。
然后充分不自信就打了个暴力跑了,也没有推出那个二位的dp。
然而我们换个角度看,其实对于每一个k题,把每种n题的情况按k题拆开并打乱,发现k长是可以独立计算的,总共n-k+1天的贡献是相同的。
所以有 $ ans= (n-k+1) \times \frac {\sum\limits_{i=1}^{m} wt[i] \times (i^k-(i-1)^k)} {m^k} $
$ (i^k-(i-1)^k $ 是k个数最大值为i的方案数