博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AGC006C Rabbit Exercise
阅读量:7044 次
发布时间:2019-06-28

本文共 1093 字,大约阅读时间需要 3 分钟。

\(f_{i,j}\) 表示兔子 \(i\) 在当前 \(j\) 轮的期望位置
对于一次操作 \(f_{i,j+1}=\frac{1}{2}(2f_{i-1,j}-f_{i,j})+\frac{1}{2}(2f_{i+1,j}-f_{i,j})=f_{i-1,j}+f_{i+1,j}-f_{i,j}\)
这个东西就是差分数组上两个位置的交换
相当于是求经过 \(k\) 次长度为 \(m\) 的置换后的位置
只要求每个位置在每个环走 \(k\) 的位置即可

# include 
using namespace std;typedef long long ll; const int maxn(1e5 + 5); int n, m, b[maxn], nxt[maxn], que[maxn], len, vis[maxn];ll k, f[maxn], g[maxn]; int main() { int i, j; scanf("%d", &n); for (i = 1; i <= n; ++i) scanf("%lld", &f[i]), b[i] = i; for (i = n; i; --i) f[i] -= f[i - 1]; scanf("%d%lld", &m, &k); for (i = 1; i <= m; ++i) scanf("%d", &j), swap(b[j], b[j + 1]); for (i = 1; i <= n; ++i) if (!vis[i]) { vis[i] = 1, j = b[i], que[len = 1] = i; while (!vis[j]) que[++len] = j, vis[j] = 1, j = b[j]; for (j = 1; j <= len; ++j) nxt[que[j]] = que[(k + j - 1) % len + 1]; } for (i = 1; i <= n; ++i) g[i] = f[nxt[i]]; for (i = 1; i <= n; ++i) g[i] += g[i - 1], printf("%lld\n", g[i]); return 0;}

转载于:https://www.cnblogs.com/cjoieryl/p/10355956.html

你可能感兴趣的文章
一次数据库hang住的分析过程
查看>>
ArcGIS使用字体文件制作符号库!
查看>>
Cocoa框架类之间的继承关系
查看>>
Windows安全认证是如何进行的?
查看>>
dll文件
查看>>
C# 多线程详解 Part.04(Lock、Monitor、生产与消费)
查看>>
HTTP协议之chunk介绍
查看>>
误区1:数据是可靠的
查看>>
根据IP找到计算机名字(小技巧)
查看>>
遍历jquery的对象
查看>>
system app 下面的apk 修改后不需要重新签名
查看>>
openoj的一个小比赛(F题解题报告)poj3978(dp+素数筛选)
查看>>
【转载】动态代理DynamicProxy 介绍
查看>>
读写cookie的方法
查看>>
淘宝技术发展(Oracle/支付宝/旺旺)
查看>>
分布式版本控制工具 Mercurial 使用教程
查看>>
使用Keil MDK运行第一个STM32程序
查看>>
同时寻找最大数和最小数的最优算法
查看>>
【Visual C++】游戏开发笔记十四 游戏画面绘图(四) 华丽的CImage类
查看>>
GDI+在VS2008 编译不过的解决方法
查看>>