NOIP2018模拟9.15

第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都可以。

当然你也可以树状数组套二分,复杂度不变,但是常数小很多,空间也小很多。

猜你喜欢

转载自www.cnblogs.com/lmlysklt/p/9658294.html