AT2164 Rabbit Exercise
解题思路
首先考虑k=1的情况,对于每一个a[i],它可能会到a[i-1]*2-a[i] 与 a[i+1]*2-a[i]两个位置,概率都为%50,那么它的期望位置为 (a[i-1]*2-a[i]+a[i+2]*2-a[i])/2 即为 a[i+1]+a[i-1]-a[i]
对于以后的位置,可以把这个位置的期望位置视作它的变化,所以也可以直接算。做出差分数组,对于i与i+1,diff[i]=a[i]-a[i-1] ,diff[i+1]=a[i+1]-a[i],如果让i这个位置跳,diff[i]=a[i+1]-a[i] ,diff[i+1]=a[i]-a[i-1], 相当于交换了位置。对于k>1 其实就是找出每个位置的循环节,然后k%(循环节-1)即为最终的位置。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
const int MAXN = 100005;
typedef long long LL;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?-1:1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
struct Data{
LL diff;
int id;
}data[MAXN];
int n,m,a[MAXN];
int fa[MAXN],num;
LL now[MAXN<<1],ans[MAXN],sum[MAXN];
bool vis[MAXN];
LL k;
int get(int x){
if(vis[x]) return 0;
now[++num]=x;
vis[x]=1;
return get(fa[x])+1;
}
int main(){
// freopen("data.txt","r",stdin);
// freopen("wrong.txt","w",stdout);
n=rd();
for(register int i=1;i<=n;i++){
a[i]=rd();
data[i].diff=a[i]-a[i-1],data[i].id=i;
}
m=rd();scanf("%lld",&k);
for(register int i=1;i<=m;i++){
int x=rd();
swap(data[x],data[x+1]);
}
for(register int i=1;i<=n;i++) {
if(data[i].id==i) continue;
fa[i]=data[i].id;
}
for(register int i=1;i<=n;i++){
if(data[i].id==i) {
ans[i]=data[i].diff;
continue;
}
if(vis[i]) continue;
int siz=get(i);
for(register int j=1;j<=siz;j++) now[j+siz]=now[j];
LL to=(k-1ll)%(LL)siz;
for(register int j=1;j<=siz;j++)
ans[now[j]]=data[now[j+to]].diff;
num=0;
}
// for(register int i=1;i<=n;i++) cout<<ans[i]<<" ";cout<<endl;
for(register int i=1;i<=n;i++)
ans[i]+=ans[i-1],printf("%lld.0\n",ans[i]);
return 0;
}
AT2164 Rabbit Exercise的更多相关文章
- [AT2164] [agc006_c] Rabbit Exercise
题目链接 AtCoder:https://agc006.contest.atcoder.jp/tasks/agc006_c 洛谷:https://www.luogu.org/problemnew/sh ...
- AT2164 [AGC006C] Rabbit Exercise
首先我们可以考虑一下 \(x\) 关于 \(y\) 的对称点的坐标,不难发现就是 \(x + 2 \times (y - x)\),那么期望的增量就会增加 \(2 \times (y - x)\).不 ...
- 【AtCoder】【思维】【置换】Rabbit Exercise
题意: 有n只兔子,i号兔子开始的时候在a[i]号位置.每一轮操作都将若干只兔子依次进行操作: 加入操作的是b[i]号兔子,就将b[i]号兔子移动到关于b[i]-1号兔子现在所在的位置对称的地方,或者 ...
- [Atcoder Grand 006 C] Rabbit Exercise 解题报告 (期望)
题目链接:https://www.luogu.org/problemnew/show/AT2164 https://agc006.contest.atcoder.jp/tasks/agc006_c 题 ...
- AT2164-[AGC006C]Rabbit Exercise【差分,倍增,数学期望】
正题 题目链接:https://www.luogu.com.cn/problem/AT2164 题目大意 \(n\)只兔子编号为\(1\sim n\),第\(i\)只在坐标轴\(x_i\)处.然后\( ...
- 【AGC006C】Rabbit Exercise 置换
题目描述 有\(n\)只兔子站在数轴上.为了方便,将这些兔子标号为\(1\ldots n\).第\(i\)只兔子的初始位置为\(a_i\). 现在这些兔子会按照下面的规则做若干套体操.每一套体操由\( ...
- 题解-AtCoder-agc006C Rabbit Exercise
Problem AtCoder & bzoj 题意:数轴上有\(n\)个点(初始坐标均为整数),编号为\(1\)~\(n\).给出\(m\)个操作. 每个操作会选定点\(a\),然后随机在点\ ...
- AtCoder Grand Contest 006 (AGC006) C - Rabbit Exercise 概率期望
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC006C.html 题目传送门 - AGC006C 题意 有 $n$ 个兔子,从 $1$ 到 $n$ 编号, ...
- 【做题】agc006C - Rabbit Exercise——模型转换
原文链接https://www.cnblogs.com/cly-none/p/9745177.html 题意:数轴上有\(n\)个点,从\(1\)到\(n\)编号.有\(m\)个操作,每次操作给出一个 ...
随机推荐
- js 禁止/允许页面滚动
参考:https://blog.csdn.net/huangfu_chunfeng/article/details/46429997 https://www.cnblogs.com/w ...
- java_缓冲流(字节输入流)
/** * java.iko.BufferedInputStream extends InputStream * BufferedInputStream:字节缓冲输入流 * 构造方法: * Buffe ...
- UMP系统架构 LVS
- Python基础知识之4——三大控制结构
控制结构就是控制程序执行顺序的结构. Python 有三大控制结构,分别是顺序结构.分支结构(选择结构)以及循环结构.任何一个项目或者算法都可以使用这三种结构来设计完成.这三种控制结构也是结构化程序 ...
- SG函数模板(洛谷2197nim游戏
#include <iostream> #include <cstdio> #include <queue> #include <algorithm> ...
- barrel shifter, logarthmic shifter and funnel shifter
1,shifter小集合 (1) simple shift 左移或右移补0 (2) arthmetic shift 左移补0,右移补符号位 (3) barrel shifter 桶型,顾名思义,应该头 ...
- 非旋Treap及其可持久化
平衡树这种东西,我只会splay.splay比较好理解,并且好打,操作方便. 我以前学过SBT,但并不是很理解,所以就忘了怎么打了. 许多用平衡树的问题其实可以用线段树来解决,我们真正打平衡树的时候一 ...
- LUOGU P2416 泡芙 (缩点+树剖)
传送门 解题思路 首先先缩点,然后将缩完点的权值改成点中路径为1的条数,然后再将边权下放到点权上,求一个每个点到根的路径和,然后用树上2点距离公式算..刚开始写的线段树,T了2个点. #include ...
- webpack 配置分离css插件
以css配置示例,less与sass同理 1. 使用旧版的ExtractTextPlugin插件 安装 npm install extract-text-webpack-plugin@next --s ...
- C++中无数据成员的类的对象占用内存大小
结论: 对于没有数据成员的对象,其内存单元也不是0,c++用一个内存单元来表示这个实例对象的存在. 如果有了数据或虚函数(虚析构函数),则相应的内存替代1标记自己的存在. PS:以下代码均在win32 ...