【做题】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 模型转换的验证 对现状的调查
模型驱动工程范式认为软件开发生命周期由工件(需求规范.分析和设计文档.测试套件.源代码)支持,这些工件是表示要构建的系统不同视图的模型.存在一个由模型转换驱动的(半)自动构造过程,从系统的抽象模型开始 ...
随机推荐
- 《大话设计模式》c++实现 抽象工厂模式
为了更清晰地理解工厂方法模式,需要先引入两个概念: 产品等级结构 :产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机.海信电视机.TCL电视机,则抽象电视机与具体品牌的电视机之间 ...
- 5.无监督学习-DBSCAN聚类算法及应用
DBSCAN方法及应用 1.DBSCAN密度聚类简介 DBSCAN 算法是一种基于密度的聚类算法: 1.聚类的时候不需要预先指定簇的个数 2.最终的簇的个数不确定DBSCAN算法将数据点分为三类: 1 ...
- IIS7配置rewriter
遇到的问题就是rewriter不起效果冲IIS6迁移过来的.最后发现是Framework 4.0的原因!记录处理方式为: 一. <configSections> <section n ...
- uvalive 11865 Stream My Contest
题意: 有一个网络中心,和许多个城市,网络中心以及城市之间有若干条边,这些边有两个属性,最大带宽和修建费用. 现在要用最多不超过C的费用修建网络,使得每个城市都有网络连接,最大化最小带宽. 带宽限制是 ...
- 20165305 Linux安装及学习
一.虚拟机的安装 在根据老师所给的<基于VirtualBox虚拟机安装Ubuntu图文教程>的时候,我发现虚拟化处于被禁用状态,于是我在网上查找了一下解决办法,在我将bios中虚拟化设置为 ...
- c# Applicatcontext类
Application类(位于System.Windows.Forms命名空间)公开了Run方法,可以调用该方法来调度应用程序进入消息循环.Run方法有三个重载 1.第一个重载版本不带任何参数,比较少 ...
- multiple definition of qt_plugin_query_metadata
dustije 5 years ago I have a project with several plugins i want to compile into one library. I get ...
- 算法训练 P0505
一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积.阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中:而35!就更大了,它已经无法存放在一个浮点型变量中.因此, ...
- AtCoder Beginner Contest 070 ABCD题
题目链接:http://abc070.contest.atcoder.jp/assignments A - Palindromic Number Time limit : 2sec / Memory ...
- nginx FastCGI错误Primary script unknown解决办法
在centos上成功编译安装nginx 1.4.php 5.4并成功启动nginx和php-fpm后,访问php提示"File not found.",同时在错误日志中看到: 复制 ...