【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只 ...
随机推荐
- Struts2(一.基本介绍,环境搭建及需求分析)
Struts2框架开发 前言 开发工具:eclipse struts1:老项目使用较多,维护时需要用到 struts2:新项目使用较多 一.特点 1. 无侵入式设计 struts2 与 struts ...
- throttle(节流)和debounce(防抖)
防抖和节流都是用来控制频繁调用的问题,但是这两种的应用场景是有区别的. throttle(节流) 有一个调用周期,在一个很长的时间里分为多段,每一段执行一次.例如onscroll,resize,500 ...
- BZOJ 1901 Zju2112 Dynamic Rankings 树状数组套线段树
题意概述:带修改求区间第k大. 分析: 我们知道不带修改的时候直接上主席树就可以了对吧?两个版本号里面的节点一起走在线段树上二分,复杂度是O((N+M)logN). 然而这里可以修改,主席树显然是凉了 ...
- Chrome 鲜为人知的秘籍(内部协议)&&Chrome功能指令大全
楼主以 Chrome 版本 39.0.2171.95 m 为例,耗费2小时的记录: chrome://accessibility 用于查看浏览器当前访问的标签,打开全局访问模式可以查看:各个标签页面的 ...
- 常用的不易记忆的css自定义代码
在制作页面时,经常会遇到需要自定义一些标签的默认行为(如:input的占位符等),但这些默认的设置的css一般比较难记住,所以有必要自己做一下记录.下面是我经常用到的一些重设默认行为的css. 1.占 ...
- 最全的NB-IoT芯片厂商、模组厂商信息
NB-IoT作为LPWAN(低功耗广域网)的新兴技术,因为具有低功耗.低成本.广覆盖.海量节点等优势,并且在授权频段可以与2G.3G无缝连接而被运营商所青睐且接受.特别是到了2017年,据统计全球有5 ...
- Live Archive 训练题 2019/3/9
7454 Parentheses A bracket is a punctuation mark, which is used in matched pairs, usually used withi ...
- Scrum立会报告+燃尽图(十月二十日总第十一次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 项目地址:https://git.coding.net/zhang ...
- Beta冲刺第二周王者荣耀交流协会第三次会议
1.例会照片: 成员王超,高远博,冉华,王磊,王玉玲,任思佳,袁玥全部到齐 master:袁玥 2.时间跨度: 2017年11月19日 17:00 — 17:11,总计11分钟. 3.地 点: 一食堂 ...
- 《C》变量
变量的存储方式和生存周期