A题 牛牛浇树

使用差分即可。

因为不带操作过程中的查询,而只需要最后的序列,直接用差分即可,记住最后的序列都要加上m,然后局部变量一定要清零。

比赛AC代码:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回m天后高度为奇数的树的数量
     * @param n int整型 
     * @param m int整型 
     * @param l int整型vector 
     * @param r int整型vector 
     * @return int整型

     */int c[1000005],a[1000005];
    int oddnumber(int n, int m, vector<int>& l, vector<int>& r) {
        for(int i = 0 ; i < m ; i ++)
            c[l[i]] ++ , c[r[i] + 1] --;
        for(int i = 1 ; i <= n ; i ++)
            a[i] = a[i - 1] + c[i];
        int Ans = 0;
        for(int i = 1 ; i <= n ; i ++)
            if((a[i] + m) % 2 == 1) Ans ++;
        return Ans;
    }
};

B题 挑选方案问题

不难发现这是一个生成函数裸题。

跟提高组IOI周赛20还是21完全是一模一样的套路。

但是其实如果你追求更快的解题,实际上我们不难发现这是一个规律题:

输入1,输出3。
输入2,输出6。
输入3,输出10
输入4,输出15
输入5,输出21

大胆猜测,得到答案表达式为

记得要强制把 转化为 long long!太坑了。

比赛AC代码:

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param n int整型 
     * @return long长整型
     */
    long long wwork(int n) {
        return (long long)((n - 1)) * (long long)(n + 4) / 2ll + 3ll;
    }
};

C题 大逃离

简单组合数 + 细节屑题。

不难发现,实际上我们可以把问题转化为:

求一个序列中,对于 来说有多少个长度为 的包含 的子序列的最大值为

不难发现做法其实就是把给定的 排序,然后假设从小到大排序后这个数的排名为 ,那么满足条件的长度为 的包含 的子序列的个数就是 , 然后除以总的方案数 就是这个数 的“概率”(意义如题目描述)。

对于求 显然不能在线求,于是预处理出阶乘数组然后O(1) 即可求出

还要注意如果比这个数小的数不足 个,那么这个点的概率就是

对于为什么求 也就是说,你必定要选当前这个数 , 同时你要在比 小的数中 (也就是 ) 个数里面选择 个数,所以满足条件的长度为 的包含 的子序列的个数就是 .

模意义下的除法需要求乘法逆元。

于是这题就做完了。

比赛AC代码

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param n int整型 
     * @param k int整型 
     * @param Point int整型vector 
     * @return int整型vector
     */
    long long Mod = 1000000007;
    long long T[300005];
    struct Y {
        long long data,id,d;
    } a[500000];
    long long quickpow(long long x,long long y)
    {
        long long ans = 1 , op = x;
        while(y)
        {
            if(y & 1) ans *= op,ans %= Mod;
            op *= op , op %= Mod;
            y >>= 1;
        }
        return ans;
    }
    map <long long,int > mp;

    static bool cmp(Y A,Y B)
    {
        return A.data < B.data;
    }

    int C(long long n,long long k)
    {
        long long A = T[n],Q1 = T[n - k] ,Q2 = T[k];
        return  (A * quickpow((Q1 * Q2)% Mod,Mod - 2)) % Mod ;
    }
    int Ans[200005];
    vector <int> ans;
    vector<int> city(int n, int k, vector<int>& Point) {

        long long All = C(n,k);
        T[0] = 1ll;
        for(int i = 1 ; i <= 2e5 ; i ++) T[i] = T[i - 1] * i , T[i] %= Mod;
        for(int i = 0 ; i < n ; i ++) a[i + 1].data = Point[i],a[i + 1].id = i;
        sort(a + 1 , a + 1 + n , cmp);
        for(int i = 1 ; i <= n ; i ++)
        {
            if(i < k)
            Ans[a[i].id] = 0;
            else Ans[a[i].id] = (C(i - 1,k - 1) * quickpow(C(n,k),Mod - 2)) % Mod;
        }
        for(int i = 1 ; i <= n ; i ++)
            ans.push_back(Ans[i - 1]);
        return ans;
    }
};