Problem

AtCoder & bzoj

题意:数轴上有\(n\)个点(初始坐标均为整数),编号为\(1\)~\(n\)。给出\(m\)个操作。

每个操作会选定点\(a\),然后随机在点\(a-1\)和点\(a+1\)中选一个,将点\(a\)以选中的点为中心做对称,将这\(m\)个操作按顺序执行\(k\)遍(\(1\)~\(m\)完整执行一次算\(1\)遍),求最终每个点的位置的期望值

Solution

不难发现根据期望的线性型,在\(a-1\)和\(a+1\)之间随机选一个进行对称操作的期望等价于在\(a-1\)和\(a+1\)的中点处进行对称

则我们发现,对于点\(B\)在点\(A\)和\(C\)之间,若\(A\)到\(B\)距离为\(a\),若\(B\)到\(C\)距离为\(b\),则对称后的位置\(B'\)与\(A\)距离为\(b\),与\(C\)距离为\(a\)(如下图)

发现如果我们用一个差分数组\(d_i=a_{i+1}-a_i\)存下\(a_i\)数组的话,对称操作相当于交换\(d_i,d_{i+1}\)

发现进行一轮操作后,整个序列会成为若干个对换环(一个对换环相当于将整个环旋转一格再重新赋值),而进行\(k\)次操作相当于将所有环旋转\(k\)格

发现如果整个环的大小为\(c\),则环旋转\(k\)次和旋转\(k\bmod c\)次是等价的,则复杂度与\(k\)无关,整体复杂度\(O(n+m)\)

Code

#include <algorithm>
#include <cstdio>
#include <cctype>
using namespace std;
typedef long long ll;
#define rg register template <typename _Tp> inline _Tp read(_Tp&x){
char c11=getchar(),ob=0;x=0;
while(c11^'-'&&!isdigit(c11))c11=getchar();if(c11=='-')ob=1,c11=getchar();
while(isdigit(c11))x=x*10+c11-'0',c11=getchar();if(ob)x=-x;return x;
} const int N=101000;
int a[N],vis[N],st[N];
ll b[N],p[N],k;
int n,m,tp; void init();void work();void print();
int main(){init();work();print();return 0;} void work(){
int x;
for(rg int i=1;i<=m;++i)read(x),swap(a[x],a[x+1]);
for(rg int i=1;i<=n;++i)if(!vis[i]){
vis[st[0]=x=i]=tp=1;
while(!vis[a[x]])
vis[st[tp++]=x=a[x]]=1;
int e=k%tp;
for(rg int j=0;j<tp;++j)
b[st[j]]=p[st[j+e<tp?j+e:j+e-tp]];
}
} void print(){
ll sm(0ll);
for(rg int i=1;i<=n;++i)
printf("%lld\n",sm+=b[i]);
} void init(){
read(n);
for(rg int i=1;i<=n;++i)read(p[i]),a[i]=i;
for(rg int i=n;i;--i)p[i]-=p[i-1];
read(m),read(k);
}

题解-AtCoder-agc006C Rabbit Exercise的更多相关文章

  1. 【做题】agc006C - Rabbit Exercise——模型转换

    原文链接https://www.cnblogs.com/cly-none/p/9745177.html 题意:数轴上有\(n\)个点,从\(1\)到\(n\)编号.有\(m\)个操作,每次操作给出一个 ...

  2. AGC006C Rabbit Exercise

    传送门 设 \(f_{i,j}\) 表示兔子 \(i\) 在当前 \(j\) 轮的期望位置 对于一次操作 \(f_{i,j+1}=\frac{1}{2}(2f_{i-1,j}-f_{i,j})+\fr ...

  3. AT2164 [AGC006C] Rabbit Exercise

    首先我们可以考虑一下 \(x\) 关于 \(y\) 的对称点的坐标,不难发现就是 \(x + 2 \times (y - x)\),那么期望的增量就会增加 \(2 \times (y - x)\).不 ...

  4. 【AtCoder】【思维】【置换】Rabbit Exercise

    题意: 有n只兔子,i号兔子开始的时候在a[i]号位置.每一轮操作都将若干只兔子依次进行操作: 加入操作的是b[i]号兔子,就将b[i]号兔子移动到关于b[i]-1号兔子现在所在的位置对称的地方,或者 ...

  5. AtCoder Grand Contest 006 (AGC006) C - Rabbit Exercise 概率期望

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC006C.html 题目传送门 - AGC006C 题意 有 $n$ 个兔子,从 $1$ 到 $n$ 编号, ...

  6. 【agc006C】Rabbit Exercise

    Portal --> agc006C Solution 啊感觉是好有意思的一道题qwq官方题解里面的说辞也是够皮的哈哈哈..(大概就是说如果你没有意识到那个trick的话这题这辈子都做不出来qw ...

  7. AtCoder Grand Contest 006 C:Rabbit Exercise

    题目传送门:https://agc006.contest.atcoder.jp/tasks/agc006_c 题目翻译 数轴上有\(N\)只兔子,从\(1\)到\(N\)编号,每只兔子初始位置是\(x ...

  8. 【AGC006C】Rabbit Exercise 置换

    题目描述 有\(n\)只兔子站在数轴上.为了方便,将这些兔子标号为\(1\ldots n\).第\(i\)只兔子的初始位置为\(a_i\). 现在这些兔子会按照下面的规则做若干套体操.每一套体操由\( ...

  9. [Atcoder Grand 006 C] Rabbit Exercise 解题报告 (期望)

    题目链接:https://www.luogu.org/problemnew/show/AT2164 https://agc006.contest.atcoder.jp/tasks/agc006_c 题 ...

随机推荐

  1. SQL Server 表值函数

    表值函数还是很有意思的,我现在想实现一个功能.就是我查询出来的内容,我要对结果进行再次查询,也要输入参数,我想了想 1.存储过程  不能对执行后的结果进行再次查询,需要创建临时表,太麻烦 2.视图  ...

  2. java io系列25之 PrintWriter (字符打印输出流)

    更多内容请参考:java io系列01之 "目录" PrintWriter 介绍 PrintWriter 是字符类型的打印输出流,它继承于Writer.PrintStream 用于 ...

  3. Redis_集群_主从模式_哨兵模式

    1.主从模式 2.哨兵模式

  4. Oracle数据库用户锁定原因以及处理方式(ORA-28000)

    现场在实施过程中,基于安全考虑(用户名和密码之前暴露给其他公司了),需要对用户密码进行修改. 修改过程很简单(alter user [username] identified by [password ...

  5. 使用JMeter进行一次简单的带json数据的post请求测试,json可配置参数

    配置: 1.新建一个线程组: 然后设置线程数.运行时间.重复次数. 2.新建Http请求: 设置服务器域名,路径,方法,编码格式,数据内容. 可以在函数助手中,编辑所需要的变量,比如本例中的随机生成电 ...

  6. 【leetcode70】【动态规划】 爬楼梯

    (1 pass 一维动态规划) 爬楼梯(easy) 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数 ...

  7. python-常用数据类型

    九 基本数据类型 什么是数据?为何要有多种类型的数据? #数据即变量的值,如age=18,18则是我们保存的数据. #变量的是用来反映/保持状态以及状态变化的,毫无疑问针对不同的状态就应该用不同类型的 ...

  8. jsp实现文件上传下载

    文件上传: upload.jsp <form action="uploadServlet" method="post" enctype="mul ...

  9. MongoDB 更新数组中的元素

    本文记录如何更新MongoDB Collection 中的Array 中的元素.假设Collection中一条记录格式如下: 现要删除scores 数组中,"type" 为 &qu ...

  10. jira安装插件svn

    1.登录jira 2.设置-插件-查找新插件 搜索 Jira Subversion plugin 3.安装成功之后 4.关联svn仓库 5.关联成功