【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只 ...
随机推荐
- Jmeter如何做接口测试
最近在学习Jmeter,记录下来,与大家分享. 1. 打开Jmeter,我用的是5.0版本,打开后如下图所示: 2. 右键测试计划,添加 - 线程(用户) - 线程组,如下如图所示: 3. 右键线程组 ...
- 宿主机ssh免密登录docker容器
一.检查系统内核 二.安装docker 1.yum install docker -y 2.docker version #查看docker版本 3.syste ...
- Linux环境下Java应用性能分析定位-CPU使用篇
1 CPU热点分析定位背景 CPU资源还是很昂贵的,为了深刻感受到这种昂贵,间下图当前CPU的资源售价: 所以对于程序猿们来说,需要让程序合理高效的使用CPU资源.利用有限的CPU资源来解决完 ...
- Python3 匿名函数
一 匿名函数 lambda函数也叫匿名函数,语法结构如下: lambda x:x+1 x --> 形参 x+1 --> 返回值,相当于return x+1 实例(Python3.0+): ...
- VisualSVN Server的配置和使用方法
VisualSVN Server的配置和使用方法 VisualSVN Server的配置和使用方法[服务器端] 安装好VisualSVN Server后[安装过程看这里],运行VisualSVN Se ...
- 在PHP中,是以分好结束一条语句的吗
在PHP中,是以分号结束一条语句的,这个和C语言类似. 但是,有一条例外,对于PHP结束tag之前的语句,是可以不写分号的: <?php if ($a == $b) { echo "R ...
- pygame (1) 移动小乌龟
小乌龟图片素材: 第一个简单的小游戏: 小乌龟会不断的移动,并且每当到达窗口的左右边界的时候,还会自动的掉头. 源码: import pygame import sys# 导入sys模块,退出时使用 ...
- 2018软工实践—Alpha冲刺(1)
o## 队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作,对多个目标检测及文字识别模型进行评估.实验 ...
- ios framework 使用图片资源
framework 的制作工程见:http://www.cocoachina.com/ios/20141126/10322.html: 遇到问题: 由于自己的framework 要使用图片资源,最后找 ...
- nodepad++ 格式化xml插件
1.用插件管理器安装xmltools插件 2.使用如下菜单格式化xml: 所有插件下载地址: http://sourceforge.net/projects/npp-plugins/files/