【做题】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 模型转换的验证 对现状的调查
模型驱动工程范式认为软件开发生命周期由工件(需求规范.分析和设计文档.测试套件.源代码)支持,这些工件是表示要构建的系统不同视图的模型.存在一个由模型转换驱动的(半)自动构造过程,从系统的抽象模型开始 ...
随机推荐
- train_val.prototxt文件和deploy.prototxt文件开头的区别
1.开头不同 对train_val.prototxt文件来说,开头部分定义训练和测试的网络及参数 对deploy.prototxt文件来说,开头部分定义实际运用场景的配置文件,其参数不定义数据来源,仅 ...
- uvm设计分析——field automation
uvm中的field_automation主要实现了class中的基础元素的copy,compare等函数, 实现方式分为两种:1)用户注册,field系列宏:uvm内部调用static status ...
- 9.if/else/elif
简单的条件是通过使用 if/else/elif 语法创建的.条件的括号是允许的,但不是必需的.考虑到基于表的缩进的性质,可以使用 elif 而不是 else/if 来维持缩进的级别. if [expr ...
- 使用Java注解自动化处理对应关系实现注释代码化
概述 假设我们要从一个 ES 索引(相当于一张DB表)查询数据,ES表有 biz_no, type, status 等字段, 而应用对象则有属性 bizNo, type, status 等.这样,就会 ...
- sklearn异常检测demo
sklearn 异常检测demo代码走读 # 0基础学python,读代码学习python组件api import time import numpy as np import matplotlib ...
- Runtime单例模式类 -- 控制电脑关机
package demo1; import java.io.IOException; public class RunTimeDemo { public static void main(String ...
- vuejs目录结构启动项目安装nodejs命令,api配置信息思维导图版
vuejs目录结构启动项目安装nodejs命令,api配置信息思维导图版 vuejs技术交流QQ群:458915921 有兴趣的可以加入 vuejs 目录结构 build build.js check ...
- HTTP接口-跨域-callback
1.客户端和正常调用非跨域接口一样2.服务端返回的时候用callback+(返回值)的方式返回结果. callback为客户端的隐藏参数.public String converJsonResultS ...
- unittest和pytest的区别
一.用例编写规则 1.unittest提供了test cases.test suites.test fixtures.test runner相关的类,让测试更加明确.方便.可控.使用unittest编 ...
- to refactor for refactor
v1.1 if all algorithm are in one function, it will expand. so each operate type should be separated. ...