【做题】agc006C - Rabbit Exercise——模型转换
原文链接https://www.cnblogs.com/cly-none/p/9745177.html
题意:数轴上有\(n\)个点,从\(1\)到\(n\)编号。有\(m\)个操作,每次操作给出一个编号\(i \, 1 < i < n\),即把点\(i\)等概率移动到它关于点\(i-1\)的对称点或关于点\(i+1\)的对称点。记顺序执行这\(m\)个操作为完成1次。问完成\(k\)次后,所有点的坐标的期望值是多少。
\(n, m \leq 10^5, \, k \leq 10^{18}\)
首先,容易得到一个坐标为x的点,关于坐标为y的点对称后,新点的坐标为2y - x。我们记点i的坐标为\(p_i\),那么对它操作后得到的新点坐标的期望值就是\(\frac {2p_{i+1} + 2p_{i-1} -2p_i} {2} = p_{i+1} + p_{i-1} - p_i\) 。
因为期望有线性性,所以我们能确信,每一次操作就是把点\(i\)的坐标变为\(p_{i+1} + p_{i-1} - p_i\),最终答案就是每个点的坐标。
但我们还是难以解决这个问题。考虑这个性质:
p_{i+1} - (p_{i+1} + p_{i-1} - p_i) &=& p_i - p_{i-1}\\
(p_{i+1} + p_{i-1} - p_i) - p_{i-1} &=& p_{i+1} - p_i
\end{eqnarray*}
\]
我们定义\(p'_i = p_i - p_{i-1}\),那么,我们发现一次操作就是交换了\(p'_i\)和\(p'_{i-1}\)。因此,这\(m\)个操作就是对\(p'\)做一个置换。我们把每个环抠出来就能得到重复做\(k\)次置换之后的结果。最好再通过\(p'\)还原出\(p\)就好了。
时间复杂度\(O(n)\)。
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
typedef long long ll;
int n,m,p[N],per[N],vis[N],ans[N],lop[N],cnt;
ll k,val[N],res[N];
int main() {
scanf("%d",&n);
for (int i = 1 ; i <= n ; ++ i)
scanf("%lld",&val[i]);
scanf("%d%lld",&m,&k);
for (int i = 1 ; i <= m ; ++ i)
scanf("%d",&p[i]);
for (int i = n ; i >= 1 ; -- i)
val[i] = val[i] - val[i-1];
for (int i = 1 ; i <= n ; ++ i)
per[i] = i;
for (int i = 1 ; i <= m ; ++ i)
swap(per[p[i]],per[p[i]+1]);
for (int i = 1 ; i <= n ; ++ i) {
if (vis[i]) continue;
cnt = 0;
lop[++cnt] = i;
int pos = per[i];
while (pos != i) {
vis[pos] = 1;
lop[++cnt] = pos;
pos = per[pos];
}
for (int j = 1 ; j <= cnt ; ++ j)
ans[lop[j]] = lop[(j + k - 1) % cnt + 1];
}
for (int i = 1 ; i <= n ; ++ i)
res[i] = val[ans[i]];
for (int i = 1 ; i <= n ; ++ i)
res[i] += res[i-1];
for (int i = 1 ; i <= n ; ++ i)
printf("%lld.0\n",res[i]);
return 0;
}
小结:这个特殊性质还是挺难找的。只能说找规律时,考虑差分、前缀和的变化是有用的。
【做题】agc006C - Rabbit Exercise——模型转换的更多相关文章
- AGC006C Rabbit Exercise
传送门 设 \(f_{i,j}\) 表示兔子 \(i\) 在当前 \(j\) 轮的期望位置 对于一次操作 \(f_{i,j+1}=\frac{1}{2}(2f_{i-1,j}-f_{i,j})+\fr ...
- AT2164 [AGC006C] Rabbit Exercise
首先我们可以考虑一下 \(x\) 关于 \(y\) 的对称点的坐标,不难发现就是 \(x + 2 \times (y - x)\),那么期望的增量就会增加 \(2 \times (y - x)\).不 ...
- AtCoder Grand Contest 1~10 做题小记
原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-1-to-10.html 考虑到博客内容较多,编辑不方便的情 ...
- C语言程序设计做题笔记之C语言基础知识(下)
C 语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行 事.并且C是相当灵活的,用于执行计算机程序能完成的 ...
- C语言程序设计做题笔记之C语言基础知识(上)
C语言是一种功能强大.简洁的计算机语言,通过它可以编写程序,指挥计算机完成指定的任务.我们可以利用C语言创建程序(即一组指令),并让计算机依指令行事.并且C是相当灵活的,用于执行计算机程序能完成的几乎 ...
- ACM 做题过程中的一些小技巧。
ACM做题过程中的一些小技巧. 1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long l ...
- 前端MVVM框架avalon - 模型转换1
轻量级前端MVVM框架avalon - 模型转换(一) 接上一章 ViewModel modelFactory工厂是如何加工用户定义的VM? 附源码 洋洋洒洒100多行内部是魔幻般的实现 1: fun ...
- AtCoder Grand Contest 11~17 做题小记
原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-11-to-20.html UPD(2018-11-16): ...
- Verification of Model Transformations A Survey of the State-of-the-Art 模型转换的验证 对现状的调查
模型驱动工程范式认为软件开发生命周期由工件(需求规范.分析和设计文档.测试套件.源代码)支持,这些工件是表示要构建的系统不同视图的模型.存在一个由模型转换驱动的(半)自动构造过程,从系统的抽象模型开始 ...
随机推荐
- sitecore系列教程之Sitecore个性化-配置文件,模式和角色
这是利用Sitecore规则引擎实现数字化转换的三部分系列的第二部分.阅读上一篇文章,通过为您的个性化体验定义内容策略来设置基础. Sitecore有一个非常强大的规则引擎,可以帮助推动个性化的用 ...
- 20165305 实验三 敏捷开发与XP实践
实验3-1 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA 参考 http://www.cnblog ...
- Hue中hive(hive cli)查询结果中显示列名,不带表名
hive cli中显示列名 进入hive cli后 set hive.cli.print.header=true; 之后出现列名,但是带了表名前缀,由于网上没找到资料,于是到官网肉眼扫描所有参数,总算 ...
- python之运算符与基本数据类型
1.开发工具:IDE pycharm(推荐).eclipse 2.运算符 结果是值 算数运算 a = 10 * 10 赋值运算 a = a + 1 a+=1 结果是布尔值 比较运算 a = 1 ...
- redis安装--转
第一部分:安装redis 希望将redis安装到此目录 1 /usr/local/redis 希望将安装包下载到此目录 1 /usr/local/src 那么安装过程指令如下: 1 2 3 4 5 6 ...
- Python爬虫【三】利用requests和正则抓取猫眼电影网上排名前100的电影
#利用requests和正则抓取猫眼电影网上排名前100的电影 import requests from requests.exceptions import RequestException imp ...
- 小纪a
感觉挺好的两段代码:虽然已经存在,但是这是我自己敲出来的,没有照抄,真心话,所以记录下来. 1.菱形代码: #include <stdio.h>void main() { int i, j ...
- STM32L476应用开发之六:电池SOC检测(转)
源: STM32L476应用开发之六:电池SOC检测
- self asyncio
import asyncio from threading import Thread import time print('main start:',time.time()) async def d ...
- Docker学习笔记之通过 Dockerfile 创建镜像
0x00 概述 由于 Docker 镜像的结构优势,使它的占用空间远小于普通的虚拟机镜像,而这就大幅减少了 Docker 镜像在网络或者其他介质中转移所花费的时间,进而提高了我们进行迁移部署的效率.不 ...