• 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)没被取完的情况:
      对答案的贡献就是:(sumlimits_{i=0}^{a_2-1}((a_1 + i) imes 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) imes (1-sumlimits_{i=0}^{a_2-1}frac{C_{a_1+i-1}^{i}}{2^{a_1+i}}))

    3. 总的就是:(ans=a_1 + sumlimits_{i=0}^{a_2 - 1}frac{i imes C_{a_1+i-1}^{i}}{2^{a_1+i}} + a_2 imes (1-sumlimits_{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}=sumlimits_{i=0}^{a-1}frac{i imes C_{a_1+i-1}^{i}}{2^{a_1+i}} + a imes (1-sumlimits_{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 + sumlimits_{i = 2}^{n}f_{a_i})

    T4

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

    抱歉口胡的,不要在意。

  • 相关阅读:
    JavaScript中的memorizing技术
    在IE6/7/8下识别html5标签
    JavaScript中的类式继承和原型式继承
    OpenSUSE环境配置
    CentOS环境配置(LNMP)
    CentOS上OpenCC中文简繁体转换
    jQuery点击按钮页面滚动条向下滚动
    javascript-数组常用方法
    Tomcat配置常见错误问题解决方法
    字符串
  • 原文地址:https://www.cnblogs.com/Zfio/p/13959369.html
Copyright © 2020-2023  润新知