题目传送门:https://agc006.contest.atcoder.jp/tasks/agc006_c

题目翻译

数轴上有\(N\)只兔子,从\(1\)到\(N\)编号,每只兔子初始位置是\(x_i\)。现在兔子们要开始做运动,运动都有\(M\)个步骤,对于第\(i\)个步骤,我们用\(a_i\)来形容它,意思是:

在当前步骤中,从左至右数第\(a_i\)只兔子将会跳跃。我们在\(a_i-1\)和\(a_i+1\)两只兔子中等概率的选择一个兔子,假设我们选择的是\(x\),那么第\(a_i\)只兔子将会跳到数轴上关于第\(x\)只兔子的坐标对称的另一个点上。

比如第\(a_i\)只兔子坐标为\(3\),第\(x\)只兔子坐标为\(5\),那么第\(a_i\)只兔子就会跳到\(7\)去。

接下来兔子们要做\(K\)轮这样的运动,请求出最后每个兔子所在坐标的期望。

\(N,M\leqslant 10^5,|x_i|\leqslant 10^9,K\leqslant 10^{18},a_i\in[2,n-1],x_i\)是整数。

题解

这种题目如果想到了就非常好做,可惜我想不到……

假设现在要跳第\(i\)只兔子,那么\(x_i=\frac{1}{2}\times (2*x_{i-1}-x_i)+\frac{1}{2}\times (2*x_{i+1}-x_i)=x_{i-1}+x_{i+1}-x_i\)。

原本这三只兔子分别在:\(x_{i-1},x_i,x_{i+1}\)

现在这三只兔子分别在:\(x_{i-1},x_{i-1}+x_{i+1}-x_i,x_{i+1}\)

看起来怪怪的,上下长度不一,所以我们把这俩序列差分一下。

原本三只兔子坐标差分序列:\(x_{i-1},x_i-x_{i-1},x_{i+1}-x_i\)

现在三只兔子坐标差分序列:\(x_{i-1},x_{i+1}-x_i,x_i-x_{i-1}\)

然后我们发现对于一次跳跃,只是交换了差分数组的两个位置而已……

也就是说,我们可以求出在\(M\)个步骤后差分数组的置换,然后根据置换求出每个位置在\(K\)轮运动之后最后是原数组的哪个元素,最后前缀和加起来就是答案了。

时间复杂度:\(O(N+M)\)

空间复杂度:\(O(N)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll; const int maxn=1e5+5; ll k;
int n,m;
int c[maxn];
bool bo[maxn];
ll a[maxn],ans[maxn];//-1e9关于1e9对称就直接爆int了 int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} int main() {
n=read();
for(int i=1;i<=n;i++)
scanf("%lld",a+i),c[i]=i;
m=read();scanf("%lld",&k);
for(int i=1;i<=m;i++) {
int x=read();
swap(c[x],c[x+1]);
}
for(int i=1;i<=n;i++)
if(!bo[i]) {
int u=i,cnt=0,step,goal;
while(!bo[c[u]])
bo[c[u]]=1,cnt++,u=c[u];//求循环节大小
step=k%cnt,goal=u=i;
for(int j=1;j<=step;j++)
goal=c[goal];
for(int j=1;j<=cnt;j++)
ans[u]=goal,u=c[u],goal=c[goal];//u和goal相差step步
}
for(int i=2;i<=n;i++) {
int x=ans[i];
ans[i]=a[x]-a[x-1];
}
ans[1]=a[1];
for(int i=1;i<=n;i++)
ans[i]+=ans[i-1],printf("%.1lf\n",(double)ans[i]);
return 0;
}

AtCoder Grand Contest 006 C:Rabbit Exercise的更多相关文章

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

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

  2. AtCoder Grand Contest 006

    AtCoder Grand Contest 006 吐槽 这套题要改个名字,叫神仙结论题大赛 A - Prefix and Suffix 翻译 给定两个串,求满足前缀是\(S\),后缀是\(T\),并 ...

  3. AtCoder Grand Contest 009 D:Uninity

    题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_d 题目翻译 定义只有一个点的树权值为\(0\),若干棵(可以是\(0\)棵)权值为\(k\) ...

  4. AtCoder Grand Contest 009 E:Eternal Average

    题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_e 题目翻译 纸上写了\(N\)个\(1\)和\(M\)个\(0\),你每次可以选择\(k\) ...

  5. AtCoder Grand Contest 004 C:AND Grid

    题目传送门:https://agc004.contest.atcoder.jp/tasks/agc004_c 题目翻译 给你一张网格图,指定的格子是紫色的,要求你构造出两张网格图,其中一张你可以构造一 ...

  6. AtCoder Grand Contest 014 D:Black and White Tree

    题目传送门:https://agc014.contest.atcoder.jp/tasks/agc014_d 题目翻译 给你一棵树,每次任选一个点染色,先手染白色,后手染黑色.如果最后存在一个白色的点 ...

  7. AtCoder Grand Contest 028 A:Two Abbreviations

    题目传送门:https://agc028.contest.atcoder.jp/tasks/agc028_a 题目翻译 给你两个串\(s\)与\(t\),长度分别为\(n,m\).问你存不存在一个串长 ...

  8. AtCoder Grand Contest 002 F:Leftmost Ball

    题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...

  9. AtCoder Grand Contest 013 C:Ants on a Circle

    题目传送门:https://agc013.contest.atcoder.jp/tasks/agc013_c 题目翻译 给你一个周长为\(L\)的圆,有\(N\)只蚂蚁在圆上爬,速度为一单位距离每秒. ...

随机推荐

  1. Head First Python 学习笔记-Chapter3:文件读取和异常处理

    第三章中主要介绍了简单的文件读取和简单的异常处理操作. 首先建立文件文件夹:HeadFirstPython\chapter3,在Head First Pythong官方站点下载须要使用的文件:sket ...

  2. 谈谈Runtime类中的freeMemory,totalMemory,maxMemory几个方法

    最近在网上看到一些人讨论到java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法的一些问题,很多人感到很疑惑,为什么,在jav ...

  3. UIView 的 autoresizingMask 属性 详解。

    转载自:liubo0_0的专栏  链接网址:http://blog.csdn.net/liubo0_0/article/details/7085935 在 UIView 中有一个autoresizin ...

  4. 如何获得(读取)web.xml配置文件的參数

    參考代码例如以下: com.atguigu.struts2.app.converters.DateConverter.java public DateFormat getDateFormat(){ i ...

  5. Maven - 下载JAR包

    进入Spring官网http://projects.spring.io/spring-framework/假设我们想下载Spring发现仅仅能 通过Maven或Cradle进行下载了. 以下以Spri ...

  6. fuser - identify processes using files or sockets

    FUSER(1) User Commands FUSER(1) NAME fuser - identify processes using files or sockets SYNOPSIS fuse ...

  7. Ubuntu16.04下屏幕侧边栏的设置

    ubnutu的任务栏都是在左侧: zhang@zhang-virtual-machine:~$ gsettings set com.canonical.Unity.Launcher launcher- ...

  8. 在Fedora 23上安装多媒体解码器

    在Fedora 23上安装多媒体解码器 时间:2016-06-25来源:topspeedsnail.com 作者:斗大的熊猫   安装多媒体解码器允许你播放更多格式的音频和视频格式.大多数这些解码器都 ...

  9. oracle sqlplus 常用操作

    命令 含义 / 运行 SQL 缓冲区 ? [关键词] 对关键词提供 SQL 帮助 @[@] [文件名] [参数列表] 通过指定的参数,运行指定的命令文件 ACC[EPT] 变量 [DEF[AULT] ...

  10. Linux学习笔记——例说makefile 综合案例

    0.前言     从学习C语言開始就慢慢開始接触makefile,查阅了非常多的makefile的资料但总感觉没有真正掌握makefile,假设自己动手写一个makefile总认为非常吃力.所以特意借 ...