题目描述

  有\(n\)只兔子站在数轴上。为了方便,将这些兔子标号为\(1\ldots n\)。第\(i\)只兔子的初始位置为\(a_i\)。

  现在这些兔子会按照下面的规则做若干套体操。每一套体操由\(m\)次跳跃组成;在第\(j\)次跳跃的时候,第\(c_j(2≤c_j≤n−1)\)只兔子会等概率随机选择第\(c_j−1\)或\(c_j+1\)只兔子中的一只(不妨设选择了第\(x\)只兔子),然后跳当前位置到关于第\(x\)只兔子对称的点。

  这些兔子会按顺序做\(k\)套相同的体操。现在请你求出,每一只兔子做完\(k\)套体操之后最终位置坐标的期望值。

  \(n,m\leq 100000,k\leq {10}^{18}\)

题解

  每次操作\(a_x=\frac{1}{2}(2a_{x-1}-a_x)+\frac{1}{2}(2a_{x+1}-a_x)=a_{x-1}+a_{x+1}-a_x\)

  可以发现这是一个线性变换,可以直接计算。

  那么有什么规律吗?

  假设有三个数\(a_1,a_2,a_3\),\(c_1=2\)。

  变换后会得到\(a_1,a_1+a_3-a_2,a_3\)。

  我们差分一下:

\[\begin{align}
a_1,a_2,a_3&\rightarrow a_1,a_2-a_1,a_3-a_2\\
a_1,a_1+a_3-a_2,a_3&\rightarrow a_1,a_3-a_2,a_2-a_1
\end{align}
\]

  相当于把\(a_{c_1},a_{c_1+1}\)交换了一下。

  所以可以直接把\(m\)次操作看成\(m\)个交换,做完这些操作看成\(1\)到\(n\)的置换。把整个置换拆成很多个轮换,直接在每个轮换上面走\(k\)步就行了。

  时间复杂度:\(O(n+m)\)

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<ctime>
  6. #include<utility>
  7. using namespace std;
  8. typedef long long ll;
  9. typedef unsigned long long ull;
  10. typedef pair<int,int> pii;
  11. ll a[100010];
  12. int c[100010];
  13. int b[100010];
  14. int d[100010];
  15. ll ans[100010];
  16. int main()
  17. {
  18. #ifdef DEBUG
  19. freopen("b.in","r",stdin);
  20. freopen("b.out","w",stdout);
  21. #endif
  22. int n;
  23. scanf("%d",&n);
  24. int i;
  25. ll sum=0;
  26. for(i=1;i<=n;i++)
  27. {
  28. scanf("%lld",&a[i]);
  29. a[i]-=sum;
  30. sum+=a[i];
  31. c[i]=i;
  32. }
  33. int m;
  34. ll k;
  35. scanf("%d%lld",&m,&k);
  36. int x;
  37. for(i=1;i<=m;i++)
  38. {
  39. scanf("%d",&x);
  40. swap(c[x],c[x+1]);
  41. }
  42. for(i=1;i<=n;i++)
  43. if(!b[i])
  44. {
  45. int cnt=0;
  46. int j;
  47. for(j=i;!b[j];j=c[j])
  48. {
  49. b[j]=1;
  50. d[++cnt]=j;
  51. }
  52. for(j=1;j<=cnt;j++)
  53. ans[d[j]]=a[d[(j+k-1)%cnt+1]];
  54. }
  55. for(i=1;i<=n;i++)
  56. {
  57. ans[i]+=ans[i-1];
  58. printf("%lld.0\n",ans[i]);
  59. }
  60. return 0;
  61. }

【AGC006C】Rabbit Exercise 置换的更多相关文章

  1. 【做题】agc006C - Rabbit Exercise——模型转换

    原文链接https://www.cnblogs.com/cly-none/p/9745177.html 题意:数轴上有\(n\)个点,从\(1\)到\(n\)编号.有\(m\)个操作,每次操作给出一个 ...

  2. AGC006C Rabbit Exercise

    传送门 设 \(f_{i,j}\) 表示兔子 \(i\) 在当前 \(j\) 轮的期望位置 对于一次操作 \(f_{i,j+1}=\frac{1}{2}(2f_{i-1,j}-f_{i,j})+\fr ...

  3. AGC600 C Rabbit Exercise —— 置换

    题目:https://agc006.contest.atcoder.jp/tasks/agc006_c 考虑 \( i \) 号兔子移动后位置的期望,是 \( x_{i+1} + x_{i-1} - ...

  4. AT2164 [AGC006C] Rabbit Exercise

    首先我们可以考虑一下 \(x\) 关于 \(y\) 的对称点的坐标,不难发现就是 \(x + 2 \times (y - x)\),那么期望的增量就会增加 \(2 \times (y - x)\).不 ...

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

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

  6. 【agc006C】Rabbit Exercise

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

  7. AGC006 C Rabbit Exercise——思路(置换)

    题目:https://agc006.contest.atcoder.jp/tasks/agc006_c 选了 i 位置后 x[ i ] = x[ i-1 ] + x[ i+1 ] - x[ i ] . ...

  8. AtCoder Grand Contest 006 (AGC006) C - Rabbit Exercise 概率期望

    原文链接https://www.cnblogs.com/zhouzhendong/p/AGC006C.html 题目传送门 - AGC006C 题意 有 $n$ 个兔子,从 $1$ 到 $n$ 编号, ...

  9. [AT2164] [agc006_c] Rabbit Exercise

    题目链接 AtCoder:https://agc006.contest.atcoder.jp/tasks/agc006_c 洛谷:https://www.luogu.org/problemnew/sh ...

随机推荐

  1. 接口自动化框架(Pytest+request+Allure)

    前言: 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱. 接口自动化包含2个部分,功能性的接口自动化测试和并发接口自动化测试. 本次文章着重介绍第一种, ...

  2. linux-高并发与负载均衡-TCP-IP基础知识

    ARP协议: ping baidu

  3. 对Vuejs框架原理名词解读

    渐进式()+虚拟Dom: vue-cli 遍历Dom:先序遍历DOM树的5种方法! 三层架构+m v c +mvp+m v vm()+MVC,MVP 和 MVVM 的图示 剖析vue MVVM实现原理 ...

  4. 1076E - Vasya and a Tree(图的遍历)

    题意:给出一棵根节点为1的树,执行m次修改操作,每次修改为a,b,c,表示a节点的子树中,距离a小于等于b的子节点的权值加上c,求m次操作后每个节点的权值 分析:用线段树维护每层节点的权值,然后dfs ...

  5. 【RSYSLOG】Log4x To Rsyslog Config

    Log4x To Rsyslog Config Log4net配置 <!--RemoteSyslogAppender--> <appender name="remoteSy ...

  6. Imbalanced Array CodeForces - 817D (思维+单调栈)

    You are given an array a consisting of n elements. The imbalance value of some subsegment of this ar ...

  7. 关于js作用域问题

    补充: function Foo(name,age){ this.name=name; this.age=age; this.getName=function(){ console.log(this) ...

  8. 多线程系列之二:Single Thread Execution 模式

    一,什么是SingleThreadExecution模式?同一时间内只能让一个线程执行处理 二,例子 1.不安全的情况 用程序模拟 三个人频繁地通过一个只允许一个人经过的门.当人通过时,统计人数便会增 ...

  9. Linux之基础知识

    在此总结使用Linux的时候,一些必须知道的基础内容,记录一下,加强记忆 一.  linux 运行级别 运行级别就是操作系统当前正在运行的功能级别.这个级别从0到6 ,具有不同的功能.这些级别在/et ...

  10. tailf、tail -f、tail -F三者区别(转)

    tail -f    等同于--follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止 tail -F     等同于--follow=name  --retry,根 ...