Portal --> agc006C

Solution

  啊感觉是好有意思的一道题qwq官方题解里面的说辞也是够皮的哈哈哈。。(大概就是说如果你没有意识到那个trick的话这题这辈子都做不出来qwq)

  一开始看到那个什么随机跳啊。。什么期望值啊。。整个人都蒙掉了。。

  然而实际上都是假的== 我们考虑一次跳跃,跳完的兔子的期望下标的表达式实际上长这个样子:

\[\frac{1}{2}(2\cdot x_{i-1}-x_i)+\frac{1}{2}(2\cdot x_{i+1}-x_i)=x_{i-1}+x_{i+1}-x_i
\]

  所以浮点数什么的都是假的==

  (然后实际上我。。一开始想偏了,想到了另一个方向就是把每次兔子跳完的下标可以直接赋成这次跳跃之后的期望下标,然后后面的其他再直接拿这个期望下标带进去算,这样是ok的原因的话。。展开一下式子什么的就知道了,但实际上这题应该先用上面式子所示这个性质)

  然后其实根据括号里面吐槽提到的内容,我们其实可以将每次跳完之后的\(x_i\)赋成\(x_{i-1}+x_{i+1}-x_i\),这样我们就获得了一个暴力模拟的做法,但是当\(K\)很大的时候显然凉凉

  所以这个时候我们再来看看这个式子,我们来快乐差分一下(数学不好的我流下来不会构造的泪水),我们令\(nw_i=x_i-x_{i-1}\),那么可以发现:

\[\begin{aligned}
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的更多相关文章

  1. 【AGC006C】Rabbit Exercise 置换

    题目描述 有\(n\)只兔子站在数轴上.为了方便,将这些兔子标号为\(1\ldots n\).第\(i\)只兔子的初始位置为\(a_i\). 现在这些兔子会按照下面的规则做若干套体操.每一套体操由\( ...

  2. 【AtCoder】【思维】【置换】Rabbit Exercise

    题意: 有n只兔子,i号兔子开始的时候在a[i]号位置.每一轮操作都将若干只兔子依次进行操作: 加入操作的是b[i]号兔子,就将b[i]号兔子移动到关于b[i]-1号兔子现在所在的位置对称的地方,或者 ...

  3. 【AGC006 C】Rabbit Exercise

    题意 有 \(n\) 只兔子在数轴上,第 \(i\) 只兔子的初始坐标为整数 \(x_i\). 现在这些兔子会按照下面的规则做体操.每一轮体操都由 \(m\) 次跳跃组成:在第 \(j\) 次跳跃时, ...

  4. 【403】COMP9024 Exercise

    Week 1 Exercises fiveDigit.c There is a 5-digit number that satisfies 4 * abcde = edcba, that is,whe ...

  5. 【UFLDL】Exercise: Convolutional Neural Network

    这个exercise需要完成cnn中的forward pass,cost,error和gradient的计算.需要弄清楚每一层的以上四个步骤的原理,并且要充分利用matlab的矩阵运算.大概把过程总结 ...

  6. 【HDU 5030】Rabbit's String (二分+后缀数组)

    Rabbit's String Problem Description Long long ago, there lived a lot of rabbits in the forest. One d ...

  7. 【BZOJ4660】Crazy Rabbit 结论+DP

    [BZOJ4660]Crazy Rabbit Description 兔子们决定在自己的城堡里安排一些士兵进行防守.给出 n 个点的坐标,和城堡里一个圆心在原点的圆形的障碍,兔子们希望从中选出 k 个 ...

  8. 【原】Coursera—Andrew Ng机器学习—编程作业 Programming Exercise 1 线性回归

    作业说明 Exercise 1,Week 2,使用Octave实现线性回归模型.数据集  ex1data1.txt ,ex1data2.txt 单变量线性回归必须实现,实现代价函数计算Computin ...

  9. 【BZOJ3661】Hungry Rabbit 贪心

    [BZOJ3661]Hungry Rabbit Description 可怕的洪水在夏天不期而至,兔子王国遭遇了前所未有的饥荒,它们不得不去外面的森林里寻找食物.为了简化起见,我们假设兔子王国中有n只 ...

随机推荐

  1. Office365创建通讯组

    Office365创建通讯组 命令 new-DistributionGroup -Name 'test' -Members tom@msazure.cn 结果 命令 new-DistributionG ...

  2. 使用经验风险最小化ERM方法来估计模型误差 开坑

    虽然已经学习了许多机器学习的方法,可只有我们必须知道何时何处使用哪种方法,才能将他们正确运用起来. 那不妨使用经验最小化ERM方法来估计 . 首先: 其中, δ代表训练出错的概率 k代表假设类的个数 ...

  3. PayPal接洽苹果 欲承接手机支付外包

    不久前,<华尔街日报>等媒体报道,苹果正计划利用iTunes内部支付功能,推出第三方手机支付服务.美国科技 新闻网站Recode1月30日引述消息人士称,移动支付领军厂商PayPal,目前 ...

  4. C++ STL中的Binary search(二分查找)

    这篇博客转自爱国师哥,这里给出连接https://www.cnblogs.com/aiguona/p/7281856.html 一.解释 以前遇到二分的题目都是手动实现二分,不得不说错误比较多,关于返 ...

  5. B. Counting-out Rhyme(约瑟夫环)

    Description n children are standing in a circle and playing the counting-out game. Children are numb ...

  6. ubuntu关闭系统自动检测错误

    sudo gedit /etc/default/apport 将enabled=1 改成 enabled=0

  7. week1:个人博客作业

    1.软件工程课程的希望和目标 老师步置的任务完整的做完,每一步都是自己做的,明白自己做的每一步,和为什么这样做. 期末考试最后为95分以上,最好是100. 每周学习这门课时间 每周2节课(90分钟)+ ...

  8. 第10章 vim程序编辑器

    vi和vim vim是vi的升级版,支持vi的所有指令 vi的使用 vi分为三种模式:一般模式.编辑模式.命令行模式 一般模式 以vi打开一个文件就直接进入一般模式了,这个模式下可以使用上下左右按键来 ...

  9. 在本地数据库目录或系统数据库目录中已经存在数据库别名""的解决办法

    在创建数据库时遇到数据库别名已存在的问题时,可以: 1. 首先用 db2 list database directory 命令看在系统数据库目录(System Database Directory)中 ...

  10. 软工网络15团队作业4-DAY3

    昨天的工作. 张陈东芳:数据库连接的检查 吴敏烽:商品实体类的检查 周汉麟:继续研究获取商品信息方法的方法和调试 林振斌:继续研究获取商品信息方法的方法和调试 李智:Cookies的检查 全体人员:优 ...