题目传送门:https://agc006.contest.atcoder.jp/tasks/agc006_c

题目翻译

数轴上有\(N\)只兔子,从\(1\)到\(N\)编号,每只兔子初始位置是\(x_i\)。现在兔子们要开始做运动,运动都有\(M\)个步骤,对于第\(i\)个步骤,我们用\(a_i\)来形容它,意思是:

在当前步骤中,从左至右数第\(a_i\)只兔子将会跳跃。我们在\(a_i-1\)和\(a_i+1\)两只兔子中等概率的选择一个兔子,假设我们选择的是\(x\),那么第\(a_i\)只兔子将会跳到数轴上关于第\(x\)只兔子的坐标对称的另一个点上。

比如第\(a_i\)只兔子坐标为\(3\),第\(x\)只兔子坐标为\(5\),那么第\(a_i\)只兔子就会跳到\(7\)去。

接下来兔子们要做\(K\)轮这样的运动,请求出最后每个兔子所在坐标的期望。

\(N,M\leqslant 10^5,|x_i|\leqslant 10^9,K\leqslant 10^{18},a_i\in[2,n-1],x_i\)是整数。

题解

这种题目如果想到了就非常好做,可惜我想不到……

假设现在要跳第\(i\)只兔子,那么\(x_i=\frac{1}{2}\times (2*x_{i-1}-x_i)+\frac{1}{2}\times (2*x_{i+1}-x_i)=x_{i-1}+x_{i+1}-x_i\)。

原本这三只兔子分别在:\(x_{i-1},x_i,x_{i+1}\)

现在这三只兔子分别在:\(x_{i-1},x_{i-1}+x_{i+1}-x_i,x_{i+1}\)

看起来怪怪的,上下长度不一,所以我们把这俩序列差分一下。

原本三只兔子坐标差分序列:\(x_{i-1},x_i-x_{i-1},x_{i+1}-x_i\)

现在三只兔子坐标差分序列:\(x_{i-1},x_{i+1}-x_i,x_i-x_{i-1}\)

然后我们发现对于一次跳跃,只是交换了差分数组的两个位置而已……

也就是说,我们可以求出在\(M\)个步骤后差分数组的置换,然后根据置换求出每个位置在\(K\)轮运动之后最后是原数组的哪个元素,最后前缀和加起来就是答案了。

时间复杂度:\(O(N+M)\)

空间复杂度:\(O(N)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll; const int maxn=1e5+5; ll k;
int n,m;
int c[maxn];
bool bo[maxn];
ll a[maxn],ans[maxn];//-1e9关于1e9对称就直接爆int了 int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} int main() {
n=read();
for(int i=1;i<=n;i++)
scanf("%lld",a+i),c[i]=i;
m=read();scanf("%lld",&k);
for(int i=1;i<=m;i++) {
int x=read();
swap(c[x],c[x+1]);
}
for(int i=1;i<=n;i++)
if(!bo[i]) {
int u=i,cnt=0,step,goal;
while(!bo[c[u]])
bo[c[u]]=1,cnt++,u=c[u];//求循环节大小
step=k%cnt,goal=u=i;
for(int j=1;j<=step;j++)
goal=c[goal];
for(int j=1;j<=cnt;j++)
ans[u]=goal,u=c[u],goal=c[goal];//u和goal相差step步
}
for(int i=2;i<=n;i++) {
int x=ans[i];
ans[i]=a[x]-a[x-1];
}
ans[1]=a[1];
for(int i=1;i<=n;i++)
ans[i]+=ans[i-1],printf("%.1lf\n",(double)ans[i]);
return 0;
}

最新文章

  1. mysql循环操作
  2. NYOJ16 矩形嵌套(DAG最长路)
  3. 在MVC或WEBAPI中记录每个Action的执行时间和记录下层方法调用时间
  4. 【Linux CentOS 在虚拟机中XShell出现: (port 22): Connection failed.】
  5. python 正则表达式汇总
  6. 使用pdfbox分页保存pdf为图片
  7. Dynamics CRM2013/2015 禁止欢迎界面(Disable the Welcome Screen)
  8. 关于bootstrap两个模态框的问题
  9. python request Payload 数据处理
  10. JHipster生成微服务架构的应用栈(四)- 网关微服务示例
  11. MySQL数据库查询中的特殊命令
  12. 英语口语练习系列-C23-运动
  13. en-zh(社会问题)social problems-2
  14. Qt5_自定义处理Windows消息函数
  15. 一步步用svg做一个声波扩散动画
  16. Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
  17. 通过shell定时备份数据库
  18. JavaWeb -cookie&amp;session&amp;application
  19. Spring boot admin 使用
  20. C语言程序设计:现代方法(第2版)第二章全部习题答案

热门文章

  1. MySQL 压缩解决方案
  2. do export method of oracle all database tables with dmp files.
  3. 【Sprint3冲刺之前】项目可行性研究报告
  4. MOS管驱动详解
  5. grep man 有删减 百科
  6. JS实现搜索模糊匹配
  7. Android中Environment与StatFs获取系统/SDCard存储空间大小
  8. android IPC通信(上)-sharedUserId&amp;amp;&amp;amp;Messenger
  9. kubernetes安装过程中遇到问题及解决
  10. 用python编写的无线AP扫描器