第6场模拟了呢。
0+50+30
第一题为什么爆零了,因为输出换了行,实际上输出只要一行。
第二题是原题啊,但是我忘记了。
第三题思路还是没有打开。
T1
题目大意:
给出一张连通图,有k个特殊点,求出每个点到特殊点的最短路的最大值。
n、m<=1e5,k<=100
题解:
因为k比较小,对每个特殊点做一次bfs即可。
T2
题目大意:
给出n个点,以及它们的度数,求合法的无向图个数。
n<=2000,度数∈{1,2}
题解:
发现合法的方案有以下特点:
1、度数为1的点会是某一条链的开头或结尾。
2、度数为2的点要么在大小至少为3的环中,要么在链中。
了解到这个,我们就可以将两种点分开考虑。
显然只要计算度数为2的点的方案数,再乘上度数为1的点两两组合的方案就是答案。
那么问题就转变成了求解度数为2的点的方案数了。
设f[i][j]表示已经使用了i个度数为2点,并且有j个在环中的方案数。
每次加入一个点,转移有3种:
1、再找两个点组成新的三元环,方案数是i*(i-1)/2。
2、将这个点插入原先的某个环中,方案数为j。
3、将这个点插入某条链中,可以插入度数为1的点两两组成的链中,也可以插入度数为2的点组成的链中,方案数分别为度数为1的点的个数/2、i-j。
记得乘上度数为1的点两两配对的方案数。
T3
题目大意:
给出一个数组a[],有m次修改(x,y),表示将a[x]的值改为y,每次修改后输出最靠前的位置i,满足a[i]=Σa[j] (j∈{1...i-1}),如果无合法位置就输出-1。
n、m<=2e5,0<=ai<=1e9
题解:
假设当前答案位置为u(不是-1),那么对于在u后面的修改都是对答案没有影响的。
我们只考虑在u前面的修改,假设修改位置为v,那么新答案可能的位置就在[v,n]中了。
因为前缀和是不下降的,设前缀和数组s[],可能成为新答案newu的位置必然满足a[newu]>=s[v-1]
我们在线段树上二分这个位置,并直接判断它是否为答案。
如果不是,那么新答案的区间就会变成[newu+1,n]了,我们的要找的位置的满足条件也会相应变化,要大于等于s[newu]了。
分析一下复杂度,最坏的情况是每一次往后跳1位,序列形如1、2、4、8、16...因为ai最多为1e9,所以最多跳log1e9次。
所以复杂度是O(mlognlog1e9),维护a和s都可以。
当然你也可以树状数组套二分,复杂度不变,但是常数小很多,空间也小很多。