1009-自闭++

A

假设我们以i为分界点,选取i以前的为J组,i以后的为S组(规定第i个被分到J组)
J组还可以选([1,i-1])这个区间里的i−1个人,方案为 (2^{i-1})
那么S组可以选((i,n])区间里的n−i个人,去掉一个都不选的不合法方案,其总方案数为 (2^{n-i}-1)

i号点的贡献为:$2{i-1} imes(2{n-i}-1) ( i的取值范围是)[1,n]$(n号点可以取,因为(2^{n-1} imes(2^{n-n}-1)=0)
那么答案就为$$sum_{i=1}{n} (2{n-i}-1) imes (2^{i-1})$$
打开括号:$$sum_{i=1}{n} (2{n-1}-2{i-1})=sum_{i=1}{n} 2{n-1}-sum_{i=1}{n} 2^{i-1}$$
整理得:$$Ans = (n-2) imes (2^{n-1})+1$$

此题规模巨大,注意使用快速乘

由于上次OB学长模拟题的影响,我想了半天的组合数,推来推去推了2h结果什么都没推出来,结果最后是这个,难受
就算得到了第一个式子我也没有化简,难受(++)
化简完了我也想不到要快速乘,难受(+=inf)

B

技巧:多起点最短路

建一个虚拟的n+1号点,然后把这个点和每个起点(要塞点)连Len=0的边
以n+1号点为起点跑Dijkstra,由于n+1号点和起点们的距离为0,这就相当于跑了一个多起点的最短路
用P[i]记录第i号点的起点是哪一个要塞点,在更新dis[i]的时候更新P(需要特判从n+1号点更新的情况),对于要塞点,P[a[i]]=a[i]

之后用一个结构体存下来再依次讨论每条边。
设这条边的长度为z,两个端点分别为x,y
如果 p[x]!=p[y] ,即存在一条p[x]→p[y]的长度为dis[x]+dis[y]+z的路径
用ans[]存下来然后取个min

由于我tcl,我又双叒叕把Dijksetra以另外一种诡异的方式写错了,导致至少30分没骗到

C

由题意可知,x到y的路径如果经过lca,边就会反向
所以用带权并查集维护边与边的限定关系和边与边的反向关系,最后需要判一下无解情况(听说直接输出有30分QwQ)
最后查询联通块(集合)个数x,答案为(2^x)(对于每一个联通块它有两种方向的选择)
完全忘记了带权并查集是个什么东西Orz Orz Orz
待会儿放上代码复习一波

原文地址:https://www.cnblogs.com/qwqq/p/11649949.html