【agc006C】Rabbit Exercise
Solution
啊感觉是好有意思的一道题qwq官方题解里面的说辞也是够皮的哈哈哈。。(大概就是说如果你没有意识到那个trick的话这题这辈子都做不出来qwq)
一开始看到那个什么随机跳啊。。什么期望值啊。。整个人都蒙掉了。。
然而实际上都是假的== 我们考虑一次跳跃,跳完的兔子的期望下标的表达式实际上长这个样子:
\]
所以浮点数什么的都是假的==
(然后实际上我。。一开始想偏了,想到了另一个方向就是把每次兔子跳完的下标可以直接赋成这次跳跃之后的期望下标,然后后面的其他再直接拿这个期望下标带进去算,这样是ok的原因的话。。展开一下式子什么的就知道了,但实际上这题应该先用上面式子所示这个性质)
然后其实根据括号里面吐槽提到的内容,我们其实可以将每次跳完之后的\(x_i\)赋成\(x_{i-1}+x_{i+1}-x_i\),这样我们就获得了一个暴力模拟的做法,但是当\(K\)很大的时候显然凉凉
所以这个时候我们再来看看这个式子,我们来快乐差分一下(数学不好的我流下来不会构造的泪水),我们令\(nw_i=x_i-x_{i-1}\),那么可以发现:
x_i&\rightarrow x_{i-1}+x_{i+1}-x_i\\
nw_i=x_i-x_{i-1}&\rightarrow x_{i-1}+x_{i+1}+x_i-x_{i-1}=x_{i+1}-x_i\\
nw_{i+1}=x_{i+1}-x_{i}&\rightarrow x_{i+1}-(x_{i+1}+x_i-x_{i-1})=x_i-x_{i-1}
\end{aligned}
\]
然后我们就会发现。。一次跳跃其实就是让\(nw_i\)和\(nw_i+1\)的位置对调了0.0
然后这题就变得很假了
因为每轮跳跃的过程是一样的,也就是说交换的模式是固定的,所以我们可以考虑处理映射而不是直接算值,我们先求出\(nw_i\)在一轮跳跃之后下标会变成什么,然后存在一个数组\(change\)里面
然后我们就可以倍增一波求出下标\(i\)在\(K\)轮跳跃之后变成了什么,这样我们就可以得到\(K\)轮跳跃之后的\(nw\)了,还原回\(x\)的话,直接前缀和一下就好了(正负抵消一下就只剩下\(x_i\)了)
所以实际上我们在计算的时候并没有真的用到期望。。之类的东西而是直接转化了问题0.0感觉真是很妙啊
时间复杂度\(O(nlogn)\),然而貌似也有\(O(n)\)的做法(不过我好像不太会qwq)
代码大概长这个样子
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=1e5+10;
ll X[N],a[N],change[N],ans[N],tmp[N],loc[N];
int n,m;
ll K;
void prework(){
for (int i=1;i<=n;++i) change[i]=i;
for (int i=1;i<=m;++i)
swap(change[a[i]],change[a[i]+1]);
}
void solve(ll y){
for (int i=1;i<=n;++i) ans[i]=i;
for (;y;y>>=1){
if (y&1){
for (int i=1;i<=n;++i) tmp[i]=ans[change[i]];
for (int i=1;i<=n;++i) ans[i]=tmp[i];
}
for (int i=1;i<=n;++i) tmp[i]=change[change[i]];
for (int i=1;i<=n;++i) change[i]=tmp[i];
}
for (int i=1;i<=n;++i) tmp[i]=X[ans[i]];
for (int i=1;i<=n;++i) X[i]=tmp[i];
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%lld",loc+i),X[i]=loc[i]-loc[i-1];
scanf("%d%lld",&m,&K);
for (int i=1;i<=m;++i) scanf("%lld",a+i);
prework();
solve(K);
ll now=0;
for (int i=1;i<=n;++i){
now+=X[i];
printf("%lld.0\n",now);
}
}
【agc006C】Rabbit Exercise的更多相关文章
- 【AGC006C】Rabbit Exercise 置换
题目描述 有\(n\)只兔子站在数轴上.为了方便,将这些兔子标号为\(1\ldots n\).第\(i\)只兔子的初始位置为\(a_i\). 现在这些兔子会按照下面的规则做若干套体操.每一套体操由\( ...
- 【AtCoder】【思维】【置换】Rabbit Exercise
题意: 有n只兔子,i号兔子开始的时候在a[i]号位置.每一轮操作都将若干只兔子依次进行操作: 加入操作的是b[i]号兔子,就将b[i]号兔子移动到关于b[i]-1号兔子现在所在的位置对称的地方,或者 ...
- 【AGC006 C】Rabbit Exercise
题意 有 \(n\) 只兔子在数轴上,第 \(i\) 只兔子的初始坐标为整数 \(x_i\). 现在这些兔子会按照下面的规则做体操.每一轮体操都由 \(m\) 次跳跃组成:在第 \(j\) 次跳跃时, ...
- 【403】COMP9024 Exercise
Week 1 Exercises fiveDigit.c There is a 5-digit number that satisfies 4 * abcde = edcba, that is,whe ...
- 【UFLDL】Exercise: Convolutional Neural Network
这个exercise需要完成cnn中的forward pass,cost,error和gradient的计算.需要弄清楚每一层的以上四个步骤的原理,并且要充分利用matlab的矩阵运算.大概把过程总结 ...
- 【HDU 5030】Rabbit's String (二分+后缀数组)
Rabbit's String Problem Description Long long ago, there lived a lot of rabbits in the forest. One d ...
- 【BZOJ4660】Crazy Rabbit 结论+DP
[BZOJ4660]Crazy Rabbit Description 兔子们决定在自己的城堡里安排一些士兵进行防守.给出 n 个点的坐标,和城堡里一个圆心在原点的圆形的障碍,兔子们希望从中选出 k 个 ...
- 【原】Coursera—Andrew Ng机器学习—编程作业 Programming Exercise 1 线性回归
作业说明 Exercise 1,Week 2,使用Octave实现线性回归模型.数据集 ex1data1.txt ,ex1data2.txt 单变量线性回归必须实现,实现代价函数计算Computin ...
- 【BZOJ3661】Hungry Rabbit 贪心
[BZOJ3661]Hungry Rabbit Description 可怕的洪水在夏天不期而至,兔子王国遭遇了前所未有的饥荒,它们不得不去外面的森林里寻找食物.为了简化起见,我们假设兔子王国中有n只 ...
随机推荐
- rocketmq Lock failed,MQ already started -c参数
今天部署rocketmq集群时一台机器部署一个master 和slave,slave部署总是失败,通过查看日志显示下面的错误 java.lang.RuntimeException: Lock fail ...
- 180726-InfluxDB基本概念小结
InfluxDB基本概念小结 InfluxDB作为时序数据库,与传统的关系型数据库相比而言,还是有一些区别的,下面尽量以简单明了的方式介绍下相关的术语概念 I. 基本概念 mysql influxdb ...
- 使用Photon引擎进行unity网络游戏开发(四)——Photon引擎实现网络游戏逻辑
使用Photon引擎进行unity网络游戏开发(四)--Photon引擎实现网络游戏逻辑 Photon PUN Unity 网络游戏开发 网络游戏逻辑处理与MasterClient 网络游戏逻辑处理: ...
- jvm之对象创建过程
常量池中定位类的符号引用 ↓ 检查符号引用所代表的类是否已被加载,解析和初始化过 → ↓ ...
- 基于C#的机器学习--颜色混合-自组织映射和弹性神经网络
自组织映射和弹性神经网络 自组织映射(SOM),或者你们可能听说过的Kohonen映射,是自组织神经网络的基本类型之一.自组织的能力提供了对以前不可见的输入数据的适应性.它被理论化为最自然的学习方式之 ...
- asp.net mvc access数据库操作
连接access数据库其实也简单,只要按照mvc的模式来就可以,遵循c v约定就可以 既然渲染试图是强类型,那么取得的数据就转换成强类型,其他一切和asp.net操作一样 DB mydb = new ...
- Sublime Text 3高效实用快捷键
2017-11-27 16:18:48 Sublime Text 3 高效实用快捷键 Sublime Text 3 软件及注册码 官网下载链接在这里,有时候会很神奇的上不去,可能是因为被Q了,可能就是 ...
- multipart/form-data post 方法提交表单,后台获取不到数据
这个和servlet容器有关系,比如tomcat等. 1.get方式 get方式提交的话,表单项都保存在http header中,格式是 http://localhost:8080/hello.do? ...
- 软工实践-Alpha 冲刺 (10/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 完成所有界面的链接,整理与测试 展示GitHub当日代码/ ...
- Codeforces Round #312 (Div. 2) E. A Simple Task 线段树+计数排序
题目链接: http://codeforces.com/problemset/problem/558/E E. A Simple Task time limit per test5 secondsme ...