题意:

有n只兔子,i号兔子开始的时候在a[i]号位置。每一轮操作都将若干只兔子依次进行操作:

加入操作的是b[i]号兔子,就将b[i]号兔子移动到关于b[i]-1号兔子现在所在的位置对称的地方,或者是关于b[i]+1号兔子现在所在的位置对称的地方,两者是等概率的。现在给出每一轮操作的兔子编号及顺序,要你求k轮之后每只兔子的位置的期望。保证操作的兔子编号为2~n-1。

数据范围:

1<=n,每一轮的操作数量<=100000

1<=k<=10^18

思路:

看见k这么大,肯定第一反应是有某种周期。

然后来看单独的一轮操作,是一个简单的求解期望的问题。因为选择b[i]-1号兔子和b[i]+1号兔子是等概率的,那么当前这只兔子的期望位置也就是确定的,也就是\(\dfrac{2a[b[i]-1]-a[b[i]]+2a[b[i]+1]-a[b[i]]}{2}=a[b[i]+1]+a[b[i]-1]-a[b[i]]\)。那么对于单轮的操作来说,就变得简单了,就是按顺序将每个兔子的位置变为上面所说的值。

那么考虑有多轮的情况。参考了网上的题解之后,原来是一个很妙的做法,考试的时候我当然没有想到╮(╯﹏╰)╭

观察改变之前的序列与查分之后的序列的差分数组。

之前:a[1],a[2],a[3] -> 差分数组:a[1],a[2]-a[1],a[3]-a[2]

之后:a[1],a[1]+a[3]-a[2],a[3] -> 差分数组:a[1],a[3]-a[2],a[2]-a[1]

神奇的事情发生了!!我们发现差分数组中,竟然是两个位置,也就是i和i+1对换了位置!!

那么到了这里,也就不难发现这就是置换了。将每一个循环求出来,然后对于每一个循环,假设循环长度为T,那么让k%=T,然后讲这个循环涉及到的所有的位置的答案都求出来,然后就做到O(n)。

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. #define MAXN 100000
  6. using namespace std;
  7. typedef long long LL;
  8. vector<int> turns[MAXN+5];//用vector来记录每一个循环
  9. LL k;
  10. int n,m,tcnt=0,chs[MAXN+5],id[MAXN+5],id2[MAXN+5];
  11. //id存的是单次操作之后的状态,id2存的是k次操作之后的操作
  12. LL x[MAXN+5],a[MAXN+5];
  13. LL a2[MAXN+5],x2[MAXN+5];
  14. //a2是之后的差分序列,x2是之后的兔子位置
  15. bool vis[MAXN+5];
  16. int main()
  17. {
  18. // freopen("rabbit.in","r",stdin);
  19. // freopen("rabbit.out","w",stdout);
  20. scanf("%d",&n);
  21. for(int i=1;i<=n;i++)
  22. scanf("%lld",&x[i]),id[i]=i;
  23. for(int i=1;i<=n;i++)
  24. a[i]=x[i]-x[i-1];
  25. scanf("%d %lld",&m,&k);
  26. for(int i=1;i<=m;i++)
  27. scanf("%d",&chs[i]),swap(id[chs[i]],id[chs[i]+1]);
  28. for(int i=1;i<=n;i++)
  29. {
  30. int p=i;
  31. if(vis[p]==true)
  32. continue;
  33. tcnt++;
  34. while(vis[p]==false)
  35. {
  36. vis[p]=true;
  37. turns[tcnt].push_back(p);
  38. p=id[p];
  39. }
  40. }
  41. for(int i=1;i<=tcnt;i++)
  42. {
  43. int T=(int)turns[i].size();//对于每一个循环单独计算
  44. int pos=k%T;
  45. //处理出开头位置所对应的最终位置,然后向后挪到来求出这个循环里的其他元素所对应的答案
  46. for(int j=0,p=pos;j<(int)turns[i].size();j++,p=(p+1)%T)
  47. id2[turns[i][j]]=turns[i][p];
  48. }
  49. for(int i=1;i<=n;i++)
  50. a2[i]=a[id2[i]];
  51. for(int i=1;i<=n;i++)
  52. x2[i]=x2[i-1]+a2[i];
  53. for(int i=1;i<=n;i++)
  54. printf("%lld.0\n",x2[i]);//因为题目要求,强行加一个.0
  55. return 0;
  56. }

【AtCoder】【思维】【置换】Rabbit Exercise的更多相关文章

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

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

  2. AGC600 C Rabbit Exercise —— 置换

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

  3. AtCoder Grand Contest 006 C:Rabbit Exercise

    题目传送门:https://agc006.contest.atcoder.jp/tasks/agc006_c 题目翻译 数轴上有\(N\)只兔子,从\(1\)到\(N\)编号,每只兔子初始位置是\(x ...

  4. 【AGC006C】Rabbit Exercise 置换

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

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

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

  6. [Atcoder Grand 006 C] Rabbit Exercise 解题报告 (期望)

    题目链接:https://www.luogu.org/problemnew/show/AT2164 https://agc006.contest.atcoder.jp/tasks/agc006_c 题 ...

  7. [AT2164] [agc006_c] Rabbit Exercise

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

  8. 题解-AtCoder-agc006C Rabbit Exercise

    Problem AtCoder & bzoj 题意:数轴上有\(n\)个点(初始坐标均为整数),编号为\(1\)~\(n\).给出\(m\)个操作. 每个操作会选定点\(a\),然后随机在点\ ...

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

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

随机推荐

  1. (二叉树 递归) leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume that ...

  2. BZOJ3932 主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=3932 题意:给出一些带有等级的线段,求一点上前K小个等级线段的等级之和 询问是对于每一个点询问前K ...

  3. idea中的一些快捷键,未完待续......

    1.快速查看注释的渲染效果 在keymap中查找“Quick Documentation”并设置自己喜欢的快捷键即可 2.全局搜索 在keymap中查找“Replace in Path”并设置自己喜欢 ...

  4. 金融量化分析【day112】:因子选股

    一.因子选股基础 二.因子选股策略实现代码 # 导入函数库 import jqdata import psutil #初始化函数,设定基准等等 def initialize(context): set ...

  5. 金融量化分析【day113】:布林带策略

    一.布林带策略简介 1.简介 2.计算公式 3.图形      二.布林带策略代码 import jqdata def initialize(context): set_benchmark('0000 ...

  6. Matlab中hold on与hold off的用法

    摘录自:https://blog.csdn.net/smf0504/article/details/51830963 https://www.cnblogs.com/shuqingstudy/p/48 ...

  7. html设置背景图片并自适应

    <style> html{ height:100%; } body{ padding: 0; margin: 0; background: url(images/2.jpg); backg ...

  8. [物理学与PDEs]第4章第3节 一维反应流体力学方程组 3.1 一维反应流体力学方程组

    1. 一维粘性热传导反应流体力学方程组 $$\beex \bea \cfrac{\p\rho}{\p t}&+\cfrac{\p}{\p x}(\rho u)=0,\\ \cfrac{\p}{ ...

  9. 函数语法:JS获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度(转载)

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...

  10. IDEA15 下运行Scala遇到问题以及解决办法

    为了让Scala运行起来还是很麻烦,为了大家方便,还是记录下来: 1.首先我下载的是IDEA的社区版本,版本号为15. 2.下载安装scala插件: 2.1 进入设置菜单. 2.2 点击安装JetBr ...