【AtCoder】【思维】【置换】Rabbit Exercise
题意:
有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)。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define MAXN 100000
using namespace std;
typedef long long LL;
vector<int> turns[MAXN+5];//用vector来记录每一个循环
LL k;
int n,m,tcnt=0,chs[MAXN+5],id[MAXN+5],id2[MAXN+5];
//id存的是单次操作之后的状态,id2存的是k次操作之后的操作
LL x[MAXN+5],a[MAXN+5];
LL a2[MAXN+5],x2[MAXN+5];
//a2是之后的差分序列,x2是之后的兔子位置
bool vis[MAXN+5];
int main()
{
// freopen("rabbit.in","r",stdin);
// freopen("rabbit.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&x[i]),id[i]=i;
for(int i=1;i<=n;i++)
a[i]=x[i]-x[i-1];
scanf("%d %lld",&m,&k);
for(int i=1;i<=m;i++)
scanf("%d",&chs[i]),swap(id[chs[i]],id[chs[i]+1]);
for(int i=1;i<=n;i++)
{
int p=i;
if(vis[p]==true)
continue;
tcnt++;
while(vis[p]==false)
{
vis[p]=true;
turns[tcnt].push_back(p);
p=id[p];
}
}
for(int i=1;i<=tcnt;i++)
{
int T=(int)turns[i].size();//对于每一个循环单独计算
int pos=k%T;
//处理出开头位置所对应的最终位置,然后向后挪到来求出这个循环里的其他元素所对应的答案
for(int j=0,p=pos;j<(int)turns[i].size();j++,p=(p+1)%T)
id2[turns[i][j]]=turns[i][p];
}
for(int i=1;i<=n;i++)
a2[i]=a[id2[i]];
for(int i=1;i<=n;i++)
x2[i]=x2[i-1]+a2[i];
for(int i=1;i<=n;i++)
printf("%lld.0\n",x2[i]);//因为题目要求,强行加一个.0
return 0;
}
【AtCoder】【思维】【置换】Rabbit Exercise的更多相关文章
- AGC006 C Rabbit Exercise——思路(置换)
题目:https://agc006.contest.atcoder.jp/tasks/agc006_c 选了 i 位置后 x[ i ] = x[ i-1 ] + x[ i+1 ] - x[ i ] . ...
- AGC600 C Rabbit Exercise —— 置换
题目:https://agc006.contest.atcoder.jp/tasks/agc006_c 考虑 \( i \) 号兔子移动后位置的期望,是 \( x_{i+1} + x_{i-1} - ...
- AtCoder Grand Contest 006 C:Rabbit Exercise
题目传送门:https://agc006.contest.atcoder.jp/tasks/agc006_c 题目翻译 数轴上有\(N\)只兔子,从\(1\)到\(N\)编号,每只兔子初始位置是\(x ...
- 【AGC006C】Rabbit Exercise 置换
题目描述 有\(n\)只兔子站在数轴上.为了方便,将这些兔子标号为\(1\ldots n\).第\(i\)只兔子的初始位置为\(a_i\). 现在这些兔子会按照下面的规则做若干套体操.每一套体操由\( ...
- AtCoder Grand Contest 006 (AGC006) C - Rabbit Exercise 概率期望
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC006C.html 题目传送门 - AGC006C 题意 有 $n$ 个兔子,从 $1$ 到 $n$ 编号, ...
- [Atcoder Grand 006 C] Rabbit Exercise 解题报告 (期望)
题目链接:https://www.luogu.org/problemnew/show/AT2164 https://agc006.contest.atcoder.jp/tasks/agc006_c 题 ...
- [AT2164] [agc006_c] Rabbit Exercise
题目链接 AtCoder:https://agc006.contest.atcoder.jp/tasks/agc006_c 洛谷:https://www.luogu.org/problemnew/sh ...
- 题解-AtCoder-agc006C Rabbit Exercise
Problem AtCoder & bzoj 题意:数轴上有\(n\)个点(初始坐标均为整数),编号为\(1\)~\(n\).给出\(m\)个操作. 每个操作会选定点\(a\),然后随机在点\ ...
- 【做题】agc006C - Rabbit Exercise——模型转换
原文链接https://www.cnblogs.com/cly-none/p/9745177.html 题意:数轴上有\(n\)个点,从\(1\)到\(n\)编号.有\(m\)个操作,每次操作给出一个 ...
随机推荐
- cogs2479 偏序(CDQ套CDQ)
题目链接 思路 四维偏序 \(CDQ\)套\(CDQ\),第一维默认有序.第二维用第一个\(CDQ\)变成有序的.并且对每个点标记上第一维属于左边还是右边.第二个\(CDQ\)处理第三维,注意两个\( ...
- python4 分支结构,循环结构 for循环
## 复习 ```python'''1.变量名命名规范 -- 1.只能由数字.字母 及 _ 组成 -- 2.不能以数字开头 -- 3.不能与系统关键字重名 -- 4._开头有特殊含义 -- 5.__开 ...
- Token防止表单重复提交和CSRF攻击
Token,可以翻译成标记!最大的特点就是随机性,不可预测,一般黑客或软件无法猜测出来. Token一般用在两个地方: 1: 防止表单重复提交 2: anti csrf攻击(Cross-site re ...
- chrome headless 无头浏览器 应用
1. 根据html生成pdf chrome.exe --headless --disable-gpu --print-to-pdf ...../index.html 2. puppeteer --- ...
- openJDK之如何下载各个版本的openJDK源码
如果我们需要阅读openJDK的源码,那么需要下载,那么该去哪下载呢? 现在JDK已经发展到版本10了,11已经处于计划中,如果需要特定版本的openJDK,它们的下载链接在哪呢? 1.openJDK ...
- 深入浅出mybatis之useGeneratedKeys参数用法
目录 在settings元素中设置useGeneratedKeys参数 在xml映射器中配置useGeneratedKeys参数 在接口映射器中设置useGeneratedKeys参数 在MyBati ...
- Chrome firefox ie等浏览器空格 宽度不一样
用半角空格 或者全角空格 相当于半格中文字符的宽度, 相当于一个中文字符宽度. 注:在chrome中两个 占一个汉字的宽度;,而在IE.firefox中四个 才占一个汉字的宽度.
- sql 发送邮件
一.启用Database Mail XPs功能. 查看Database Mail XPs功能是否打开,从返回结果来看,value为0说明没有打开,注意SQL Mail XPs是SQL Server早期 ...
- angularjs指令中的compile与link函数详解补充
通常大家在使用ng中的指令的时候,用的链接函数最多的是link属性,下面这篇文章将告诉大家complie,pre-link,post-link的用法与区别. angularjs里的指令非常神奇,允许你 ...
- Distance on the tree(数剖 + 主席树)
题目链接:https://nanti.jisuanke.com/t/38229 题目大意:给你n个点,n-1条边,然后是m次询问,每一次询问给你u,v,w然后问你从u -> v 的路径上有多少边 ...