zoukankan      html  css  js  c++  java
  • ARC109E 1D Reversi Builder【期望,分析性质】

    传送门

    给定长为 (n) 的黑白序列 (c_i) 和正整数 (s)。小黑和小白在下黑白棋,初始时第 (s) 个位置有 (c_s) 色的棋子,两人轮流操作,小黑先手:选择与已有棋子相邻的位置 (i),在上面下 (c_i) 色棋子,并找到距离其最近的同色棋子的位置 (j),当 (j) 存在时令 (i)(j) 之间的棋子都变为 (c_i) 色。

    不能操作时游戏就结束了。小黑想让黑色棋子尽量多,小白想让白色棋子尽量多。

    给定正整数 (n)(forall sin[1,n]),求当 (c) 均匀随机生成时最终黑色棋子数的期望值(mod 998244353)

    (nle 2cdot 10^5)


    1D 黑白棋显然很sb,手玩一下就知道任意时刻状态都是一段黑+一段白或者反过来。

    (c_1=c_n) 则最终状态一定全是 (c_1),否则设开头相同连续段是 ([1,L]),结尾是 ([R,n]),则小黑会向黑连续段冲锋(?),只要先到了 ((L,R)) 就是小黑的,否则就是小白的。

    可以考虑求两项差值,当 (s-L e R-s) 时两边对称,否则中间一段就是小黑的。

    时间复杂度 (O(n))

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N = 200003, mod = 998244353;
    int n, f[N];
    int ksm(int a, int b){
    	int res = 1;
    	for(;b;b >>= 1, a = (LL)a * a % mod)
    		if(b & 1) res = (LL)res * a % mod;
    	return res;
    } int qmo(int x){return x + ((x>>31)&mod);}
    int main(){
    	scanf("%d", &n); int tmp = (n & 1) ? (n+mod>>1) : (n>>1);
    	for(int i = 2, pw = ksm(2, mod-n);i <= n;++ i, pw = pw * 4ll % mod)
    		f[i] = (f[i-1] + (2*i-1ll)*pw) % mod; // 2i-1 = the length of (L,R)
    	for(int i = 1;i <= n;++ i)
    		printf("%d
    ", (i <= 2 || i >= n-1) ? tmp : qmo(tmp + f[i-max(2*i-n,1)] - mod));
    }
    
  • 相关阅读:
    读《大道至简》有感(结束)
    super一些要点
    读《大道至简》有感(六)
    随机数数组 框图输出
    读《大道至简》有感(五)
    《需求工程》阅读笔记03
    《需求工程》阅读笔记01
    天明闹钟开发过程2
    《需求工程》阅读笔记02
    天明闹钟开发过程1
  • 原文地址:https://www.cnblogs.com/AThousandMoons/p/14608049.html
Copyright © 2011-2022 走看看