题目描述

  有\(n\)只兔子站在数轴上。为了方便,将这些兔子标号为\(1\ldots n\)。第\(i\)只兔子的初始位置为\(a_i\)。

  现在这些兔子会按照下面的规则做若干套体操。每一套体操由\(m\)次跳跃组成;在第\(j\)次跳跃的时候,第\(c_j(2≤c_j≤n−1)\)只兔子会等概率随机选择第\(c_j−1\)或\(c_j+1\)只兔子中的一只(不妨设选择了第\(x\)只兔子),然后跳当前位置到关于第\(x\)只兔子对称的点。

  这些兔子会按顺序做\(k\)套相同的体操。现在请你求出,每一只兔子做完\(k\)套体操之后最终位置坐标的期望值。

  \(n,m\leq 100000,k\leq {10}^{18}\)

题解

  每次操作\(a_x=\frac{1}{2}(2a_{x-1}-a_x)+\frac{1}{2}(2a_{x+1}-a_x)=a_{x-1}+a_{x+1}-a_x\)

  可以发现这是一个线性变换,可以直接计算。

  那么有什么规律吗?

  假设有三个数\(a_1,a_2,a_3\),\(c_1=2\)。

  变换后会得到\(a_1,a_1+a_3-a_2,a_3\)。

  我们差分一下:

\[\begin{align}
a_1,a_2,a_3&\rightarrow a_1,a_2-a_1,a_3-a_2\\
a_1,a_1+a_3-a_2,a_3&\rightarrow a_1,a_3-a_2,a_2-a_1
\end{align}
\]

  相当于把\(a_{c_1},a_{c_1+1}\)交换了一下。

  所以可以直接把\(m\)次操作看成\(m\)个交换,做完这些操作看成\(1\)到\(n\)的置换。把整个置换拆成很多个轮换,直接在每个轮换上面走\(k\)步就行了。

  时间复杂度:\(O(n+m)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
ll a[100010];
int c[100010];
int b[100010];
int d[100010];
ll ans[100010];
int main()
{
#ifdef DEBUG
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
int n;
scanf("%d",&n);
int i;
ll sum=0;
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
a[i]-=sum;
sum+=a[i];
c[i]=i;
}
int m;
ll k;
scanf("%d%lld",&m,&k);
int x;
for(i=1;i<=m;i++)
{
scanf("%d",&x);
swap(c[x],c[x+1]);
}
for(i=1;i<=n;i++)
if(!b[i])
{
int cnt=0;
int j;
for(j=i;!b[j];j=c[j])
{
b[j]=1;
d[++cnt]=j;
}
for(j=1;j<=cnt;j++)
ans[d[j]]=a[d[(j+k-1)%cnt+1]];
}
for(i=1;i<=n;i++)
{
ans[i]+=ans[i-1];
printf("%lld.0\n",ans[i]);
}
return 0;
}

【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. AGC600 C Rabbit Exercise —— 置换

    题目:https://agc006.contest.atcoder.jp/tasks/agc006_c 考虑 \( i \) 号兔子移动后位置的期望,是 \( x_{i+1} + x_{i-1} - ...

  4. AT2164 [AGC006C] Rabbit Exercise

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

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

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

  6. 【agc006C】Rabbit Exercise

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

  7. AGC006 C Rabbit Exercise——思路(置换)

    题目:https://agc006.contest.atcoder.jp/tasks/agc006_c 选了 i 位置后 x[ i ] = x[ i-1 ] + x[ i+1 ] - x[ i ] . ...

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

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

  9. [AT2164] [agc006_c] Rabbit Exercise

    题目链接 AtCoder:https://agc006.contest.atcoder.jp/tasks/agc006_c 洛谷:https://www.luogu.org/problemnew/sh ...

随机推荐

  1. 第八次oo作业

    作业五 作业五是当前最后一次电梯作业,也是我们第一次接触到多线程编程,输入方式也由之前的一次性输入变为了实时输入,其中涉及到大量的同步和冲突,其中学习多线程的使用也花了大量的时间,但总的来说为以后的作 ...

  2. sql存储过程中使用 output、nvarchar(max)

    1.sql存储过程中使用 output CREATE PROCEDURE [dbo].[P_Max] @a int, -- 输入 @b int, -- 输入 @Returnc int output - ...

  3. Dapper.NET

    关于Dapper.NET的相关论述   年少时,为何不为自己的梦想去拼搏一次呢?纵使头破血流,也不悔有那年少轻狂.感慨很多,最近事情也很多,博客也很少更新了,毕竟每个人都需要为自己的生活去努力. 最近 ...

  4. apply和call方法

    真伪数组转换 /* apply和call方法的作用: 专门用于修改方法内部的this 格式: call(对象, 参数1, 参数2, ...); apply(对象, [数组]); */ function ...

  5. 分布式文件系统FastDFS

    fastdfs_百度百科https://baike.baidu.com/item/fastdfs/5609710 用FastDFS一步步搭建文件管理系统 - bojiangzhou - 博客园http ...

  6. Jmeter监控服务器笔记

    Jmeter监控服务器-CPU,Memory,Disk,Network性能指标 本文主要说一下如何通过JMeter插件来监控服务器CPU.内存.磁盘.网络等相关资源. 一.下载 首先进入网址https ...

  7. js-其他跨域技术(JSONP`Comet)

    ###1.  JSONP JSONP由两部分组成:回调函数和数据 JSONP是通过动态<script>元素来使用的,使用时可以为src属性指定一个跨域URL eg: function ha ...

  8. [转帖]BRD、MRD 和 PRD

    来源: https://www.zhihu.com/question/19655491 BRD 商业需求文档 Business Requirement Document MRD 市场需求文档 Mark ...

  9. transform: translate(-50%, -50%) 实现块元素百分比下居中

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  10. Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念(转)

    PO(persistant object) 持久对象 在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了.通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理.可以 ...