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}\times(2-1) \(
i的取值范围是\)[1,n]$(n号点可以取,因为\(2^{n-1}\times(2^{n-n}-1)=0\))
那么答案就为$$\sum_{i=1}{n} (2-1)\times (2^{i-1})$$
打开括号:$$\sum_{i=1}{n} (2-2{i-1})=\sum_{i=1}\ 2{n-1}-\sum_{i=1}\ 2^{i-1}$$
整理得:$$Ans = (n-2)\times (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
待会儿放上代码复习一波