[atARC109E]1D Reversi Builder
归纳每一次操作后必然是两个颜色相同的连续段(即ww...bb...或bb...ww...),对操作的位置分类讨论不难证明正确性
当$c_{1}=c_{n}$,由于端点颜色不会修改,再根据该结论,可以得到$f(s,c_{i})=c_{1}\cdot n$(w为0,b为$n$)
当$c_{1}\ne c_{n}$(以下假设$c_{1}=b$且$c_{n}=w$),令$x=\min_{c_{i}=w}i$且$y=\max_{c_{i}=b}i$,考虑答案的上下限,最坏情况下即为$[1,x)$,最好情况下为$[1,y]$
对$x-1$和$y+1$哪个先取分类讨论:
1.若$x-1$先取,则当选择$y$后(也有可能是先选$y$再选$x-1$,但同理),$[1,y]$必然都为黑色(且不会再被翻转),即达到上限,因此如果$x-1$到$s$的距离小于等于$s$到$y+1$的距离,则答案为$[1,y]$
2.若$y+1$先取,类似的可以得到$[x,n]$都为白色,即答案取到下限$[1,x)$,因此如果$x-1$到$s$的距离大于$s$到$y+1$的距离,则答案为$[1,x)$
(另外对于$c_{1}=w$且$c_{n}=b$,不是两倍而是$s'=n-s+1$时的答案)
这显然包含了所有情况,即答案仅与$x$、$y$和$s$有关,得到了一个暴力$o(n^{3})$的做法,代码如下
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define mod 998244353
5 int n,mi[N],ans[N];
6 int main(){
7 scanf("%d",&n);
8 if (n==1){
9 printf("%d",(mod+1)/2);
10 return 0;
11 }
12 mi[0]=1;
13 for(int i=1;i<=n;i++)mi[i]=mi[i-1]*2%mod;
14 for(int i=2;i<=n;i++){
15 for(int j=1;j<=n;j++)ans[j]=(ans[j]+i-1)%mod;
16 for(int j=i+1;j<n;j++)
17 for(int k=1;k<=n;k++)
18 if (abs(i-1-k)<=abs(j+1-k))ans[k]=(ans[k]+1LL*j*mi[j-i-1])%mod;
19 else ans[k]=(ans[k]+1LL*(i-1)*mi[j-i-1])%mod;
20 }
21 int inv=1;
22 for(int i=1;i<=n;i++)inv=1LL*(mod+1)/2*inv%mod;
23 for(int i=1;i<=n;i++)printf("%lld\n",(ans[i]+ans[n-i+1]+1LL*mi[n-2]*n)%mod*inv%mod);
24 }
将$y=x-1$的特殊情况累加后即为$\frac{n(n-1)}{2}$,然后对于$k$的枚举改为差分,时间复杂度降为$o(n^{2})$,代码如下
1 for(int i=2;i<=n;i++)
2 for(int j=i+1;j<n;j++){
3 int k=(j+i)/2;
4 ans[1]=(ans[1]+1LL*j*mi[j-i-1])%mod;
5 ans[k+1]=(ans[k+1]-1LL*(j-i+1)*mi[j-i-1]%mod+mod)%mod;
6 }
7 for(int i=2;i<=n;i++)ans[i]=(ans[i]+ans[i-1])%mod;
8 int inv=1,s=1LL*n*(n-1)/2%mod;
9 for(int i=1;i<=n;i++){
10 inv=1LL*(mod+1)/2*inv%mod;
11 ans[i]=(ans[i]+s)%mod;
12 }
进一步的,对于$ans[1]$的修改比较好处理,对于$ans[k+1]$的修改可以枚举$j-i$,那么$k=\frac{j-i}{2}+i$,再进行一次差分即可,时间复杂度即降为$o(n)$
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define mod 998244353
5 int n,mi[N],ans[N];
6 int main(){
7 scanf("%d",&n);
8 if (n==1){
9 printf("%d",(mod+1)/2);
10 return 0;
11 }
12 mi[0]=1;
13 for(int i=1;i<=n;i++)mi[i]=mi[i-1]*2%mod;
14 for(int i=1;i<=n-3;i++){
15 ans[i/2+3]=(ans[i/2+3]-1LL*(i+1)*mi[i-1]%mod+mod)%mod;
16 ans[i/2+n-i+1]=(ans[i/2+n-i+1]+1LL*(i+1)*mi[i-1]%mod)%mod;
17 }
18 for(int i=2;i<=n;i++)ans[i]=(ans[i]+ans[i-1])%mod;
19 for(int i=3;i<n;i++)ans[1]=(ans[1]+1LL*i*(mi[i-2]-1))%mod;
20 for(int i=2;i<=n;i++)ans[i]=(ans[i]+ans[i-1])%mod;
21 int inv=1,s=1LL*n*(n-1)/2%mod;
22 for(int i=1;i<=n;i++){
23 inv=1LL*(mod+1)/2*inv%mod;
24 ans[i]=(ans[i]+s)%mod;
25 }
26 for(int i=1;i<=n;i++)printf("%lld\n",(ans[i]+ans[n-i+1]+1LL*mi[n-2]*n)%mod*inv%mod);
27 }
[atARC109E]1D Reversi Builder的更多相关文章
- I - 一次元リバーシ / 1D Reversi(水题)
Problem Statement Two foxes Jiro and Saburo are playing a game called 1D Reversi. This game is playe ...
- 2018.09.20 atcoder 1D Reversi(模拟)
传送门 考虑每次摆石头都会消去最外层的一个连续颜色串. 所以只用统计一下有多少段颜色即可. 代码: #include<bits/stdc++.h> using namespace std; ...
- ARC109F - 1D Kingdom Builder
一行格子,其中小于\(0\)的格子为白色,大于\(n\)的格子为黑色,中间的格子颜色由题目给出. 有一些格子需要被标记.标记按照以下规则进行:选择一个颜色\(c\),找到一个未标记的 旁边有标记点的 ...
- [atARC109F]1D Kingdom Builder
考虑最终有石子的位置的状态,判断一种状态是否可行 反过来,依次删除石子,删除条件是:当删除的石子是该段最后一个(即其两边都没有石子了),要求除其以外,每个连续段旁边的两个点都与其颜色不同 构造一种删除 ...
- AtCoder Regular Contest 109
Contest Link 为什么还没有 Official Editorial 啊--哦,原来是日文题解,那没事了. A - Hands 有两幢 100 层的楼房 \(A,B\) ,将地面所在的楼层称为 ...
- atcoder题目合集(持续更新中)
Choosing Points 数学 Integers on a Tree 构造 Leftmost Ball 计数dp+组合数学 Painting Graphs with AtCoDeer tarja ...
- 【AtCoder】ARC063
ARC063 C - 一次元リバーシ / 1D Reversi 不同的颜色段数-1 #include <bits/stdc++.h> #define fi first #define se ...
- 23种设计模式--建造者模式-Builder Pattern
一.建造模式的介绍 建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...
- PHP设计模式(五)建造者模式(Builder For PHP)
建造者模式:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示的设计模式. 设计场景: 有一个用户的UserInfo类,创建这个类,需要创建用户的姓名,年龄,爱好等信息,才能获得用 ...
随机推荐
- JVM学习笔记——方法区
方法区 Method Area 方法区在逻辑上属于堆的一部分,但可以看做是一块独立于 Java 堆的内存空间.所有的字段和方法字节码,以及一些特殊的方法,如构造函数,接口代码在此定义.所有定义方法的信 ...
- Midway Serverless 发布 2.0,一体化让前端研发再次提效
作者 | 张挺 来源 | Serverless 公众号 自去年 Midway Serverless 1.0 发布之后,许多业务开始尝试其中,并利用 Serverless 容器的弹性能力,减少了大量研发 ...
- SphereEx 登陆 ApacheCon Asia|依托 ShardingSphere 可插拔架构体系打造数据应用完整生态
2021 年 8 月 8 日,ApacheCon 首次亚洲大会于线上正式闭幕.作为久负盛名的开源盛宴,本届 ApacheCon Asia 受到了海内外众多开源领域人士的关注. 作为 Apache 软件 ...
- Java中的基本类型和包装类
Java中基本数据类型与包装类型有 基本类型 包装器类型 boolean Boolean char Character int Integer byte Byte short Shor ...
- Frida高级逆向-Hook Native(Java So)2
Frida Hook So 一些操作说明 Native方法第一个参数是 JNIEnv *env 如何在Frida中获取 JNIEnv 对象呢? Java.vm.getEnv(); 如何将string类 ...
- Less-(26~28) preg_replace3
Less-26: 核心语句: 各种回显均存在. 本题相比Less-25,多屏蔽了很多符号: 首先是各种注释符 --+,#,/**/ . /[]/表示字符集合:任何出现在里面的字符均会被替换. 屏蔽 ...
- Java:AQS 小记-1(概述)
Java:AQS 小记-1(概述) 概述 全称是 Abstract Queued Synchronizer(抽象队列同步器),是阻塞式锁和相关的同步器工具的框架,这个类在 java.util.conc ...
- Java:volatile笔记
Java:volatile笔记 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. volatile 和 JMM 内存模型的可见性 JUC 下的三个包 java ...
- 【二食堂】Alpha - Scrum Meeting 2
Scrum Meeting 2 例会时间:4.11 20:00 - 20:30 进度情况 组员 今日进度 明日任务4.12不开会 李健 1. 学习并成功搭建简单的网页issue2. 学习JS基础知识i ...
- BUAA 2020 软件工程 个人博客作业
BUAA 2020 软件工程 个人博客作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 ...