首页 > 其他分享 >AtCoder Regular Contest 109 E 1D Reversi Builder

AtCoder Regular Contest 109 E 1D Reversi Builder

时间:2023-04-18 20:23:27浏览次数:47  
标签:2t AtCoder limits Contest sum long 109 maxn ans

洛谷传送门

AtCoder 传送门

考虑固定 \(s\) 和每个格子的颜色,最终有多少个石子被染黑。

结论: 任何时刻只有不多于两个极大同色连通块。

证明: 设 \([x,y]\) 为当前的黑连通块,\([y+1,z]\) 为白连通块。如果下一次染 \(x-1\),若 \(x-1\) 为白,则 \([x-1,z]\) 都被染为白;否则 \(x-1\) 被染为黑。下一次染 \(z+1\) 同理。

下文令 \(0\) 为白,\(1\) 为黑,记 \(c_i\) 为第 \(i\) 个格子的颜色。

  • 如果 \(c_1 = c_n = 0\),最终所有石子都会被染白;
  • 如果 \(c_1 = c_n = n\),最终所有石子都会被染黑;
  • 如果 \(c_1 \ne c_n\),不失一般性地,假设 \(c_1 = 1, c_n = 0\)。记 \(x\) 为最大的下标满足 \(\forall i \in [1,x], c_i = c_1\),\(y\) 为最小的下标满足 \(\forall i \in [y,n], c_i = c_n\)。若 \(x + 1 = y\),最终有 \(x\) 个石子被染黑;否则先手肯定要尽快使 \(x\) 被染为黑,后手要尽快使 \(y\) 被染为白,这样中间 \(y - x - 1\) 个石子肯定归某个人了。\([1,x]\) 最后肯定被染黑,\([y,n]\) 最后肯定被染白,如果先手先到 \(x\),即 \(s - x \ge y - s\),则 \([x+1,y-1]\) 归先手;否则归后手。

这样枚举 \(s,x,y\),就得到了一个 \(O(n^3)\) 的做法。

考虑如果 \(s - x \ne y - s\),把 \(c\) 黑白翻转后,最后的染色状态与翻转前互补,则配对后两个状态的答案的和为 \(n\);如果 \(s - x = y - s\),\([x + 1, y - 1]\) 归先手,配对后两个状态的答案和为 \(n + y - x - 1\)。

设 \(ans_s\) 为初始位置为 \(s\) 时不同状态染黑石子数量的总和,可得:

\[ans_s = n2^{n-1} + \sum\limits_{x=1}^n \sum\limits_{y=1}^n [x + y = 2s \land y - x - 3 \ge 0] (y - x - 1) 2^{y-x-3} \]

这样是 \(O(n^2)\) 的。

考虑枚举 \(y - x = 2t\),则 \(x = s - t, y = s + t\),可得:

\[ans_s = n2^{n-1} + \sum\limits_{t=1}^n [1 \le s - t \land s + t \le n \land 2t - 3 \ge 0] (2t - 1) 2^{2t - 3} \]

\(t\) 的范围可以算出是 \([2,\min(n-s,s-1)]\),所以:

\[ans_s = n2^{n-1} + \sum\limits_{t=2}^{\min(n-s,s-1)} (2t - 1) 2^{2t - 3} \]

设 \(f_i = \sum\limits_{t=2}^i (2t - 1) 2^{2t - 3}\),\(f\) 可以前缀和 \(O(n)\) 求出,可得:

\[ans_s = n2^{n-1} + f_{\min(n-s,s-1)} \]

最后乘 \(\frac{1}{2^n}\) 就是期望。

至此终于以 \(O(n)\) 的时间复杂度做完了本题。

code
// Problem: E - 1D Reversi Builder
// Contest: AtCoder - AtCoder Regular Contest 109
// URL: https://atcoder.jp/contests/arc109/tasks/arc109_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 200100;
const ll mod = 998244353;
const ll inv2 = (mod + 1) / 2;

int n;
ll ans[maxn], pw[maxn], inv[maxn], f[maxn];

void solve() {
	scanf("%d", &n);
	pw[0] = inv[0] = 1;
	for (int i = 1; i <= n; ++i) {
		pw[i] = pw[i - 1] * 2 % mod;
		inv[i] = inv[i - 1] * inv2 % mod;
	}
	for (int i = 1; i <= n; ++i) {
		ans[i] = pw[n - 1] * n % mod;
	}
	for (int i = 2; i * 2 <= n; ++i) {
		f[i] = (f[i - 1] + (i * 2 - 1) * pw[i * 2 - 3] % mod) % mod;
	}
	for (int i = 1; i <= n; ++i) {
		ans[i] = (ans[i] + f[min(n - i, i - 1)]) % mod;
	}
	for (int i = 1; i <= n; ++i) {
		printf("%lld\n", ans[i] * inv[n] % mod);
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:2t,AtCoder,limits,Contest,sum,long,109,maxn,ans
From: https://www.cnblogs.com/zltzlt-blog/p/17330951.html

相关文章

  • PAT Basic 1109. 擅长C
    PATBasic1109.擅长C1.题目描述:当你被面试官要求用C写一个“HelloWorld”时,有本事像下图显示的那样写一个出来吗?2.输入格式:输入首先给出26个英文大写字母A-Z,每个字母用一个\(7×5\)的、由C和.组成的矩阵构成。最后在一行中给出一个句子,以回车结束。句子是由......
  • AtCoder Regular Contest 109 D L
    洛谷传送门AtCoder传送门这种题根本做不出来……考虑一个L形怎么方便地表示出来。可以发现对于组成L形的三个点\((x_1,y_1),(x_2,y_2),(x_3,y_3)\),只要知道\(x=x_1+x_2+x_3\)和\(y=y_1+y_2+y_3\),就能确定三个坐标。证明是设折点坐标为\((p,q)\),则其余两......
  • AtCoder Regular Contest 106 F Figures
    洛谷传送门AtCoder传送门晚自习的时候胡出来的做法(((首先你会发现题目等价于求\(\sum\limits_{(\sum\limits_{i=1}^na_i)=2(n-1)\land\foralli\in[1,n],1\lea_i\led_i}\prod\limits_{i=1}^n\dfrac{d_i!}{(d_i-a_i)!}\)。翻译一下就是枚举每个点的度数\(a_i\)......
  • ABC297F AtCoder Beginner Contest 297 F - Minimum Bounding Box 2
    https://atcoder.jp/contests/abc297/tasks/abc297_f在\(n\timesm\)的棋盘上放置\(k\)个棋子,记矩形A为能覆盖所有\(k\)个棋子的最小的矩形,求A的面积的期望将问题反过来考虑,枚举每种矩形有多少种放置棋子的方案,对于一个\(n\timesm\)的矩形,我们可以用容斥的方法......
  • AtCoder Beginner Contest 295
    ThreeDaysAgo我们定义一个只由数字构成的字符串中的字符能够被重排成相同的两份,我们称这个字符串是个好字符串,比如12341234现在给定一个字符串\(S\),找出所有的\([l,r]\),使得在这段区间中的子段是个好字符串题解:思维+组合计数首先我们根据题意得到:一个好字符串中所有相......
  • Atcoder题解:Agc002_f
    我们可以把这个理解成一种类似卡塔兰数的形式,我们发现,被安排的\(0\)球总数\(i\)和已经出现的颜色种数\(j\)在任意时刻都必须满足\(i\gej\)。然后就可以\(dp\)了,我们每次钦定下一个转移的球是某种颜色。如果下一个转移的球不是\(0\),那么我们就一次性把后面所有这种颜色......
  • Atcoder题解:Agc004_e
    \[吓死我了,还以为写了半天的被自己删掉了\]\[但是\text{Ctrl+S}会保存草稿啊\]\[以后一定要保留这个好习惯\]第一步转化题意,我们把“所有机器人移动”转化成“出口带着边框移动”,而在出口运动过程中超出边框的机器人,就“死”了。然后我们发现,出口运动过程中,假设出口目前走到......
  • Atcoder题解:Agc013_e
    我们考虑转化题意,一个合法的将\(1\simN\)划分成长度依次为\(a_1,a_2,\cdotsa_k\)的小区间,对答案的贡献为\(a_1^2a_2^2\cdotsa_k^2\)。化贡献为方案数,我们在每个长度为\(a_i\)的小区间内放置两个独立的标记,每个合法的划分方案对放置标记方案种数的贡献恰好是其对最终答......
  • AtCoder 板刷 / vp 记录
    ARC104AtCoder传送门A题解一道小学数学题,$X=\frac{A+B}{2},Y=\frac{A-B}{2}$。B题解一道暴力题。发现子串合法的充要条件是$cnt_{\text{A}}=cnt_{\text{T}}\landcnt_{\text{G}}=cnt_{\text{C}}$,暴力统计即可。C题解简单区间dp。发现$[1,2n]$可以拆......
  • AtCoder Regular Contest 104 F Visibility Sequence
    洛谷传送门AtCoder传送门考虑连边\((i,p_i)\)(若\(p_i=-1\)则不连边),可以发现形成了一篇内向树森林且这个森林存在一个dfs序为\(1,2,...,n\)。这棵森林有如下性质:\(\forallv\inson_u,h_u>h_v\)\(\forallv,w\inson_u\landv<w,h_v\leh_w\)考虑一个\(p......