11.11模拟

T1

注意快读会把每行末尾的换行符读掉。
显然将关系转化成有向图,最后跑一遍拓扑看有没有环即可。考试的时候困的要死复杂度没算对,以为跑拓扑会T,所以为了骗分每加一条边就dfs搜一边,如果出了环就直接标记上。这样复杂度不太对,不过如果它环比较小可能会骗到点分。
当然数据比较水,就这么过了,还比tarjan判环跑得快挺多。

T2

n,q小于等于10000的只会\(O(nq)\)爆扫一遍...听说只要用点技巧少扫几个就能骗到60分,反正我是不会。当然别用algorithm自带的那个max,手写、三目、if都行。

对于 \(|a_i| \leq 1\) 的,把式子提一个\(x\)出来:

\[f_{i}(x)=x(a_{i}x+b_i) \]

由于\(a[i]\)只可能为-1, 0 ,1,显然后面的一次函数只有三种斜率。对于x<0,x>0分别按b最小最大考虑即可。

正解是维护凸包,单调栈或者二分都可以,但是我一个都不会。

于是有一种取巧的做法:

还是这个式子\(f_{i}(x)=x(a_{i}x+b_i)\)
显然的是当x>=0时后面括号里的东西越大越好,当x<0时括号里的东西越小越好。

于是把询问都离线下来,对于x>=0和x<0的询问分别处理。
考虑x>=0怎么做,首先将x从小到大排序,同时将所有直线按b从大到小排序,对于一条直线,当他b小于前一条直线时,只有他的a大于前一条直线时这条直线才是有用的。
由于x从小到大排序了,所以后面的x取到最优值的直线一定在排在前面的x取到最优值的那条直线的后面,所以可以维护一个指针,对于每个x从指针往后扫一遍有用的直线,如果能取到最优值就更新指针位置及答案。

int pos = 1;
for (register int i = 1; i <= n1; ++i) {
    x = x1[i].v;
    for (register int j = pos; j <= m; ++j) {
        if (a[j] * x * x + b[j] * x >= ans[x1[i].id])
	    ans[x1[i].id] = a[j] * x * x + b[j] * x, pos = j;
    }
}

x<0时同理去做即可。

显然当所有x的最优值都在前几条直线上取到时这种做法会被卡掉,因为每次为了保证正确性都会把后面的所有直线扫一遍,但是数据没有那么强,配合上面\(|a_i| \leq 1\)的特判即可水过本题。

T3

前两个点只会大概为\(O(n^{\max a_i})\)的爆搜,但是考场上挂了,还没改。

n=2的式子不会推,弱哭了...

对于N=2的情况,可以分为两种来考虑:a2没被取完,a2被取完了。

  1. 对于\(a_2\)没被取完的情况:
    对答案的贡献就是:\(\sum\limits_{i=0}^{a_2-1}((a_1 + i) \times \frac{C_{a_1+i-1}^{i}}{2^{a_1+i}})\)
    对于\(\frac{C_{a_1+i-1}^{i}}{2^{a_1+i}}\)我的理解可能不够准确,我的理解就是这种选法的方案数比上总的方案数,即概率。组合数那里减一的原因是保证最后一个选的是\(a_1\)

  2. 对于\(a_2\)取完的情况:
    贡献也是次数乘上概率,此时直接用1减去前一种情况的概率和即为所需概率。
    形式化一点:\((a_1 + a_2) \times (1-\sum\limits_{i=0}^{a_2-1}\frac{C_{a_1+i-1}^{i}}{2^{a_1+i}})\)

  3. 总的就是:\(ans=a_1 + \sum\limits_{i=0}^{a_2 - 1}\frac{i \times C_{a_1+i-1}^{i}}{2^{a_1+i}} + a_2 \times (1-\sum\limits_{i=0}^{a_2-1}\frac{C_{a_1+i-1}^{i}}{2^{a_1+i}})\)

考虑正解,我们的最终需求只有\(a_1\),所以对于别的\(a\),他们是不会相互影响的,也就是说,我们不关心他们之间的相对关系,也不关心每个\(a\)最终会是多少,而只关心每个\(a\)\(a_1\)之间的关系是怎样的。

怎么解释能更明白一点...让我再想想...

根据期望的线性性以及上述,\(N=2\)的做法是普适的。
所以定义一个函数\(f_{a}=\sum\limits_{i=0}^{a-1}\frac{i \times C_{a_1+i-1}^{i}}{2^{a_1+i}} + a \times (1-\sum\limits_{i=0}^{a-1}\frac{C_{a_1+i-1}^{i}}{2^{a_1+i}})\)
含义是在当前的\(a_1\)下,\(a_i\)的贡献的期望,也就是每个\(a_i\)被取的期望次数。

这个函数可以\(O(1)\)的转移,于是可以预处理一下。

答案即为:\(a_1 + \sum\limits_{i = 2}^{n}f_{a_i}\)

T4

1跟8的点树剖之后直接暴力跳父亲就能做吧,大概...还没改到这。
a[i]<2的点的话...
a[i]=0时答案就是距离,不会有变化。当a[i]=1时,如果他到一个点的距离为偶数,a[i]会使贡献+1,对每个a[i]=1的点预处理到一个祖先的路径上距离为偶数的点的个数,用倍增实现应该、大概、也许是行的...

抱歉口胡的,不要在意。

posted @ 2020-11-11 16:31  zfio  阅读(87)  评论(0编辑  收藏  举报