题目传送门: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. 自己定义一个Dialog样式的Activity窗体,切换到Dialog的方法

    首先定义一个style 在style里面加入 <style name="MyDialog" parent="@android:Theme.Dialog"& ...

  2. 微型企业如何使用odoo

    作者 jeffery Q913547235 保留所有权利     Odoo可以帮助微型企业提升运营效率,做到电子化,信息化. 管理仓库进销存,建立收货单.交货单,并基于收货.交货情况确认应收款和应付款 ...

  3. js随机数 从头开始系列

    js要常常写啊要不然就要从0开始 1 var num = Math.random(); //创建一个0-1随机数字 num*=10 //变为0-10随机数字 //有好几种取整方式 var i = Ma ...

  4. mysql存储过程之循环

    链接: http://www.blogjava.net/rain1102/archive/2011/05/16/350301.html

  5. Mysql多线程性能测试工具sysbench 安装、使用和测试

    From:http://www.cnblogs.com/zhoujinyi/archive/2013/04/19/3029134.html 摘要:      sysbench是一个开源的.模块化的.跨 ...

  6. Excel应用----制作二级下拉菜单【转】

    应用: 原始数据源是两列的源数据,那该如何制作二级下拉菜单, 当然可以将这两列的数据源,转换成上面的那种格式,再用上面的方法来制作. 今天教大学的方法是直接通过这种两列式的数据源来制作下拉菜单,如果A ...

  7. Mysql导出大量数据

    outfile 导出文件   select name from t1 into outfile "/tmp/test.txt"   infile 导入文件 导入到表t1中的name ...

  8. Model Vaildation

    https://docs.asp.net/en/latest/mvc/models/validation.html 许多有用的验证属性都必须引用命名空间: System.ComponentModel. ...

  9. js event 的target 和currentTarget

    target  点击的实际tag currentTarget 绑定事件的target

  10. JavaScript中批量设置Css样式

    设置 input 元素的  属性: document.getElementsByTagName("INPUT")[0].setAttribute("属性",&q ...