【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只 ...
随机推荐
- 用Micro:bit做床头灯
这是一个非常简单的项目,给孩子们介绍感应和控制,使用光敏电阻LDR作为光线传感器和床头灯的LED. 这也介绍了模拟输入的概念.数字输入为ON或OFF.只有0和1两种可能的条件.仿真输入是一系列可能值中 ...
- 剑指 Offer——数字在排序数组中出现的次数
1. 题目 2. 解答 时间复杂度为 \(O(n)\) 的算法,顺序遍历数组,当该数字第一次出现时开始记录次数. class Solution { public: int GetNumberOfK(v ...
- Hyperledger_Fabric_Model
Hyperledger_Fabric_Model 本部分描述了Hyperledger Fabric的主要设计特点 Assets: 资产定义使得任何东西都可以通过货币值在网络中交易,从食物到老爷车再到期 ...
- 梯度下降算法以及其Python实现
一.梯度下降算法理论知识 我们给出一组房子面积,卧室数目以及对应房价数据,如何从数据中找到房价y与面积x1和卧室数目x2的关系? 为了实现监督学习,我们选择采用自变量x1.x2的线性函数来评估因变 ...
- 你应该知道的PHP库
Libchart – 这也是一个简单的统计图库. JpGraph – 一个面向对象的图片创建类. Open Flash Chart – 这是一个基于Flash的统计图. RSS 解析 解释RSS并是一 ...
- curl和file_get_contents 区别以及各自的优劣
PHP中fopen,file_get_contents,curl函数的区别: 1.fopen /file_get_contents 每次请求都会重新做DNS查询,并不对 DNS信息进行缓存.但是CUR ...
- PHP中的变量名,函数名,类名是区分大小写的吗
在PHP中,自定义的函数名,类名,以及内置的函数,关键字是不区分大小写的,比如: class,Class,CLASS,while,While,ECHO,echo,NULL,Null 都是一样的. 但是 ...
- tensorflow之曲线拟合
视频链接:https://morvanzhou.github.io/tutorials/machine-learning/ML-intro/ 1.定义层 定义 add_layer() from __f ...
- POJ2528的另一种解法(线段切割)
题目:Mayor's posters 原文地址 首先本题题意是:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意 的,但是必定是单位宽度的整数倍,且&l ...
- lintcode-451-两两交换链表中的节点
451-两两交换链表中的节点 给一个链表,两两交换其中的节点,然后返回交换后的链表. 样例 给出 1->2->3->4, 你应该返回的链表是 2->1->4->3. ...