首页 > 其他分享 >Atcoder ABC242H Random Painting

Atcoder ABC242H Random Painting

时间:2024-03-23 12:13:28浏览次数:22  
标签:Atcoder limits min int sum i64 ABC242H maxn Painting

对于这个 \(\max\) 似乎没有什么好的办法,考虑 \(\min-\max\) 反演。
记 \(t_i\) 为第 \(i\) 格被染黑的时间,有 \(E(\max(t_i)) = \sum\limits_{S} (-1)^{|S| + 1} E(\min(t_i))(i\in S)\)。

考虑如果知道了 \(S\),那么就可以知道 \(c = \sum\limits_{i = 1}^m [[l_j, r_j]\cap S\not= \varnothing]\)。
\(x\) 意义是只要选到了这 \(x\) 条中的任意一条就能成为 \(\min\),概率为 \(\frac{c}{m}\),那么 \(E(\min) = \frac{m}{c}\)。

但是因为 \(n\) 的范围肯定不能直接枚举 \(S\)。
考虑到实际上只需要知道 \(c\) 和 \(|S|\) 还有对应的方案数就可以得到答案,前者是为了算期望,而后者是系数。

于是初步想法是把 \(c, |S|\) 扔进状态,维护方案数,同时为了转移还需要再添加一维表示处理到的前缀。
即设 \(f_{i, c, |S|}\) 为处理到 \([1, i]\) 且 \(i\) 必选同时 \(c, |S|\) 是这些值对应的方案数,转移可以考虑从前面的一个端点转移过来。

考虑到转移肯定就是多了 \(i\) 这个点,\(|S|\) 带来的影响就是 \(+1\),对贡献的影响就是 \(\times (-1)\)。
那么就可以想到把 \((-1)^{|S| + 1}\) 这个东西也放到维护的值里面去。
记上面设的 \(\text{DP}\) 是 \(g\),即设 \(f_{i, c}\) 为处理到 \([1, i]\) 且 \(i\) 必选同时 \(c\) 是这个值时 \(\sum\limits_{j = 0}^m (-1)^{j + 1} g_{i, c, j}\) 的值。
为避免算重线段,可以预处理对于 \(x, y\) 满足 \(x < l, l\le y\le r\) 的线段条数 \(v_{x, y}\)。
转移即为 \(f_{i, c} = \sum\limits_{k = 0}^{i - 1} f_{k, c - v_{k, i}}\times (-1)\)。

时间复杂度 \(O(n^2m)\)。

代码
#include<bits/stdc++.h>
using i64 = long long;
const i64 mod = 998244353;
const int maxn = 4e2 + 10;
i64 c[maxn][maxn], f[maxn][maxn];
i64 inv[maxn];
int main() {
    int n, m; scanf("%d%d", &n, &m);
    inv[0] = inv[1] = 1;
    for (int i = 2; i <= m; i++) inv[i] = (mod - mod / i) * inv[mod % i] % mod;
    for (int i = 1, l, r; i <= m; i++) {
        scanf("%d%d", &l, &r);
        for (int x = 0; x < l; x++) for (int y = l; y <= r; y++) c[x][y]++;
    }
    f[0][0] = mod - 1;
    for (int i = 1; i <= n; i++) for (int j = 0; j <= m; j++)
        for (int k = 0; k < i; k++) if (j >= c[k][i])
            (f[i][j] += mod - f[k][j - c[k][i]]) %= mod;
    i64 ans = 0;
    for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) (ans += f[i][j] * m % mod * inv[j] % mod) %= mod;
    printf("%lld\n", ans);
    return 0;
}

标签:Atcoder,limits,min,int,sum,i64,ABC242H,maxn,Painting
From: https://www.cnblogs.com/rizynvu/p/18090944

相关文章

  • Atcoder ARC132E Paw
    考虑最后往左走往右走的覆盖情况。能发现肯定是有两个洞之间,或者是第一个洞左边,最后一个洞右边没有被覆盖,而左边的都被覆盖为向左,右边的都被覆盖为向右。大致证明就是考虑左边这一部分,如果有向右的,那么其右边的洞肯定都需要走过才行,不然会被覆盖,那么这样就可以一次性走出左边,就......
  • Atcoder ARC140D One to One
    考虑到对于\(n\)个点的连通块,那就有\(n\)条边,就是个基环树。如果这里面有\(1\)个\(-1\),那么就是\(n-1\)条边,就是一棵树。如果有\(2\)个\(-1\),\(n-2\)条边一定不连通,不可能出现。令\(-1\)的个数为\(c\)。那么先对于已知的边连上,如果一个连通块是基环树就直......
  • AtCoder Beginner Contest 345
    A-Leftrightarrow(abc345A)题目大意给定一个字符串,问是不是形如<======...====>的字符串。解题思路根据长度构造出期望的字符串,再判断是否相等即可。神奇的代码s=input()print("Yes"ifs=="<"+"="*(len(s)-2)+">"else"No")B-Inte......
  • AtCoder Beginner Contest 345
    A-Leftrightarrow#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingldb=longdouble;#defineintlonglongusingvi=vector<int>;usingpii=pair<int,int>;constintmod=1e9+7;......
  • AtCoder Beginner Contest 345 A-F 题解
    A-LeftrightarrowQuestion给你一个由<、=和>组成的字符串\(S\)。请判断\(S\)是否是双向箭头字符串。字符串\(S\)是双向箭头字符串,当且仅当存在一个正整数\(k\),使得\(S\)是一个<、\(k\)个=和一个>的连接,且顺序如此,长度为\((k+2)\)。Solution按照题意......
  • Atcoder ARC165D Xor Sum 5
    考虑到这个最终的答案是\(\oplus\),所以只需要考虑每种排列出现的次数的奇偶,如果为奇再计算贡献即可。考虑什么情况下出现次数为奇。令每个数出现的个数为\(c_{1\simn}\),方案数即为\(\dbinom{k}{c_1,c_2,\cdots,c_n}=\prod_{i=1}^n\dbinom{k-\sum\limits_{j=1}^{......
  • Monoxer Programming Contest 2024(AtCoder Beginner Contest 345)
    MonoxerProgrammingContest2024(AtCoderBeginnerContest345)\(A\)Leftrightarrow\(100pts\)按照题意模拟即可。点击查看代码intmain(){strings;inta=0,b=0,c=0,i;cin>>s;for(i=0;i<s.size();i++){a+=(s[i]=='<&#......
  • AtCoder-abc345_f题解
    题意简述给定一个无向图。你要在其中选出一些边,使得选出的边所构成的图中,度数为奇数的点有\(K\)个。如果可以,输出选了哪些边,否则输出-1。思路首先在选一条边时,边两端点度数的奇偶性一定都会改变,即要么都变为奇数,要么两个点的奇偶性交换过来,要么都变为偶数。这三种情况时满足......
  • AtCoder Beginner Contest 345
    是这样的,C的longlong只开了ans没开全局,AC12WA12,调了一个小时,在赛后1min发现了该错误。没开longlong见祖宗,望周知;这是C的码,简单的小题一只,可怜的longlong。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;strings;intn,f,ans;map<char......
  • AtCoder Grand Contest 022 E Median Replace
    洛谷传送门AtCoder传送门考虑对于一个确定的串怎么判断合法性。容易发现删到某个时刻若\(1\)的个数大于\(0\)的个数了,因为我们肯定不会蠢到在不是全\(1\)的时候删\(111\),所以\(c_1-c_0\)在不是全\(1\)的时候至少是不会变小的。所以我们的目标就是让\(c_1-c_0......