平时二十三测

 

 

昨日AK, 今日垫底, 我简直是在坐过山车;

以后记住有返回值的函数一定要写返回值,不然全部输出0

题解:

第一题:全是-1, 是2^(n-1)-1,不会证,样例很明显;

对于有X个跟班的人,设它的期望函数f(X)=2^X-1;

利用期望的线性性,E(A)+E(B)=E(C),则E(B)=E(C)-E(A);

E(C)=初始都是-1的局面到之剩一个人;

E(A)=当前到只剩一个人;

求E(B)就直接用打表的规律;整个局面的期望函数值为:所有人期望函数值之和。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 1e6 + 5;
int cnt[M], bin[M];
const int mod = 1e9 + 7;



int main(){
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
    int n, u;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++){
        scanf("%d", &u);
        if(u != -1) cnt[u]++;
    }
    bin[0] = 1;
    for(int i = 1; i <= n; i++) bin[i] = (bin[i-1]<<1) % mod;
    int ans = bin[n-1] - 1;
    for(int i = 1; i <= n; i++)
        ans = (ans - (bin[cnt[i]]-1) + mod) % mod;
    printf("%d\n", ans);
}
View Code

第二题:dp[i][0/1][0/1] 一维表示考虑到第i个数,二维表示前一个数是否与当前一样,三维表示是否已经合法,

转移就像扫雷一样用中间的转移;

第三题:利用扫描线算法,首先将所有坐标离散化,然后按照正方向枚举x坐标,每次求出当前这个横坐标能看见的某个矩形,将其标记并更新答案。直到这个横坐标所有能看见的矩形均被标号为止。

并且,将每个颜色的权值设为其操作的编号 将每个矩形视作两条线段: 矩形的左侧视为加入当前矩形,右侧+1的位置视为删去当前矩形。用线段树+set维护。对于每个线段树上的节点,存储两个值与一个set,分别设为maxv,minv,S

maxv表示:当前区间内能够看见的,编号最大的未被
标记的颜色。
 minv表示:当前区间内能看见的最小的颜色。(用于更
新maxv)
 S存储完全覆盖了当前区间的所有颜色。
 接下来是更新maxv和minv

理解起来很容易,maxv的更新就不用说了,对minv的更新:里层的min就是左右区间内能看见颜色的最小值,而外层的max是因为:当前区间内都被这个值覆盖,所以取max。

然后,若maxv<minv,说明当前maxv这个颜色一定被其他已更新颜色覆盖掉了,因为它连当前区间内能看见的最小的值都不够。所以将maxv修正为-1,即记为当前区间不含可以被更新的颜色。

每更新一次,继续判断根节点的maxv是否为-1,若不是则继续标记,若是则停止。

O(nlog^2)

猜你喜欢

转载自www.cnblogs.com/EdSheeran/p/9901814.html