题目描述

  有\(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. vue报错信息

    1.Property or method "xxx" is not defined on the instance but referenced during render. 原因 ...

  2. 剑指Offer-- 二叉搜索树的后序遍历序列判断

    版本1:C++ class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { ) return fals ...

  3. Python学习第十一篇——for 的本质及如何正确修改列表

    假如现在有一个列表:magicians_list = ['mole','jack','lucy'],现在想通过一个函数来实现,在列表的每个元素前面加上“the Great”的字样.现在通过一个函数来实 ...

  4. Python是如何进行内存管理

    三个方面:一对象的引用计数机制,二垃圾回收机制,三内存池机制 一.对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数. 引用计数增加的情况: 1,一个对象分 ...

  5. debian下 Hadoop 1.0.4 集群配置及运行WordCount

    说明:我用的是压缩包安装,不是安装包 官网安装说明:http://hadoop.apache.org/docs/r1.1.2/cluster_setup.html,繁冗,看的眼花...大部分人应该都不 ...

  6. 【问题解决方案】The MathType Dll cannot be found 问题解决方案

    先贴几个可能的方法: 如何解决MathPage.wll或MathType.dll文件找不到问题 The MathType Dll cannot be found 问题解决办法 如果还搞不定,试试卸载重 ...

  7. python3 打开页面后多窗口处理三种方法

    多窗口处理三种方法 导包,实例化浏览器from selenium import webdriver fx=webdriver.Firefox()方法一fx.switch_to.window(fx.wi ...

  8. 小程序wepy.js框架总结

    wepy.js借鉴了Vue的语法风格和功能特性,对官方提供的框架进行了封装,更贴近于MVVM架构模式,让开发者更加容易上手,增加开发效率.(脏数据处理--是否有标识.是否有响应) 前端开发的对组件化开 ...

  9. C# Note25: .Net Core

    .NET Core全面扫盲贴 .NET Core与.NET Framework.Mono之间的关系 https://www.postgresql.org/

  10. npm install、npm install --save、npm install --save --dev、npm install -S、npm install -D的区别

    npm install X: 会把X包安装到node_modules目录中 不会修改package.json 之后运行npm install命令时,不会自动安装X npm install X –sav ...