AtCoder Grand Contest 006 C:Rabbit Exercise
题目传送门: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的更多相关文章
- AtCoder Grand Contest 006 (AGC006) C - Rabbit Exercise 概率期望
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC006C.html 题目传送门 - AGC006C 题意 有 $n$ 个兔子,从 $1$ 到 $n$ 编号, ...
- AtCoder Grand Contest 006
AtCoder Grand Contest 006 吐槽 这套题要改个名字,叫神仙结论题大赛 A - Prefix and Suffix 翻译 给定两个串,求满足前缀是\(S\),后缀是\(T\),并 ...
- AtCoder Grand Contest 009 D:Uninity
题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_d 题目翻译 定义只有一个点的树权值为\(0\),若干棵(可以是\(0\)棵)权值为\(k\) ...
- AtCoder Grand Contest 009 E:Eternal Average
题目传送门:https://agc009.contest.atcoder.jp/tasks/agc009_e 题目翻译 纸上写了\(N\)个\(1\)和\(M\)个\(0\),你每次可以选择\(k\) ...
- AtCoder Grand Contest 004 C:AND Grid
题目传送门:https://agc004.contest.atcoder.jp/tasks/agc004_c 题目翻译 给你一张网格图,指定的格子是紫色的,要求你构造出两张网格图,其中一张你可以构造一 ...
- AtCoder Grand Contest 014 D:Black and White Tree
题目传送门:https://agc014.contest.atcoder.jp/tasks/agc014_d 题目翻译 给你一棵树,每次任选一个点染色,先手染白色,后手染黑色.如果最后存在一个白色的点 ...
- AtCoder Grand Contest 028 A:Two Abbreviations
题目传送门:https://agc028.contest.atcoder.jp/tasks/agc028_a 题目翻译 给你两个串\(s\)与\(t\),长度分别为\(n,m\).问你存不存在一个串长 ...
- AtCoder Grand Contest 002 F:Leftmost Ball
题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...
- AtCoder Grand Contest 013 C:Ants on a Circle
题目传送门:https://agc013.contest.atcoder.jp/tasks/agc013_c 题目翻译 给你一个周长为\(L\)的圆,有\(N\)只蚂蚁在圆上爬,速度为一单位距离每秒. ...
随机推荐
- git 怎样删除远程仓库的最近一次错误提交?
假设你有3个commit如下: commit 3 commit 2 commit 1 其中最后一次提交commit 3是错误的,那么可以执行: git reset --hard HEAD~1 你会发现 ...
- java 发送微信客服消息
package com.baosight.wechat.service; import net.sf.json.JSONObject; import org.apache.commons.httpcl ...
- What is love ? and how to do?
1.匹配度(matched-degree): 灵性 文化(东西方.南北方) 智力 审美 性 2.对待差异的原则(The principle of difference): 抓大放小 求同存异 心脑并用 ...
- 怎样隐藏Windows7 系统保留分区
安装Windows7操作系统时须要预留出100MB左右的系统保留盘分区.在Windows7激活是必须给它分配盘符,否则无法将其成功激活,但是激活后该盘符永久地显示了出来,怎样将其隐藏掉呢? 1.隐藏前 ...
- js改变css样式
CreateTime--2017年10月31日15:14:12 Author:Marydon js改变css样式 1.js改变单个css样式 HTML部分 <div id="tes ...
- Jenkins系列之-—08 实现SQL脚本批量执行
公司内部推广DevOps,所有目前在维护阶段和开发阶段项目全部配置上了自动发布.采用Jenkins+SVN+ANT,之后批量执行SQL语句的实现提上日程 一.环境 Linux环境 安装ANT工具,且下 ...
- bash 的环境配置文件
http://www.cnblogs.com/ggjucheng/archive/2012/11/01/2750179.html bash 的环境配置文件 你是否会觉得奇怪,怎么我们什么动作都没有进行 ...
- oracle sql修改序列为当前序列开始
declare v_num integer; last_value integer;Begin select SEQ_TBM_ID.NEXTVAL into last_value from d ...
- ORACLE时间函数(SYSDATE)简析
ORACLE时间函数(SYSDATE)简析 分类: 原文地址:ORACLE时间函数(SYSDATE)简析 作者:skylway 加法 select sysdate,add_months(sysdate ...
- OpenCV 入门示例之一:显示图像
前言 本文展示一个显示图像的示例程序,它用于从硬盘加载一副图像并在屏幕上显示. 代码示例 // 此头文件包含图像IO函数的声明 #include "highgui.h" int m ...