AGC006C Rabbit Exercise

传送门
设 \(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 <bits/stdc++.h>
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

时间: 2024-10-30 10:53:54

AGC006C Rabbit Exercise的相关文章

AT2164 AGC006C Rabbit Exercise

AT2164 AGC006C Rabbit Exercise 数轴上有 \(n\) 个点,每个点的坐标为 \(a_i\) .一轮操作包含 \(m\) 次变换,第 \(i\) 次将 \(b_i(1<b_i<n)\) 随机跳到点关于 \(b_i-1\) 或 \(b_i+1\) 的对应点.求 \(k\) 轮操作后每个点的期望位置 \(n,\ m\leq10^5,\ k\leq10^{18},\ |a_i|\leq10^9\) 期望,差分,倍增 假设点 \(a_i\) 变换后坐标为 \(x\) ,则

[Atcoder Grand 006 C] Rabbit Exercise 解题报告 (期望DP)

题目链接:https://www.luogu.org/recordnew/show/8712459 https://agc006.contest.atcoder.jp/tasks/agc006_c 题目描述 NN 匹のうさぎがいます. うさぎ達は 11 から NN まで番号が振られています. 最初.うさぎ ii は数直線上の座標 x_ixi? にいます. うさぎ達は体操をすることにしました. 11 セット分の体操は.次のような合計 MM 回のジャンプからなります. jj 回目のジャンプでは.うさ

题解-AtCoder-agc006C Rabbit Exercise

Problem AtCoder & bzoj 题意:数轴上有\(n\)个点(初始坐标均为整数),编号为\(1\)~\(n\).给出\(m\)个操作. 每个操作会选定点\(a\),然后随机在点\(a-1\)和点\(a+1\)中选一个,将点\(a\)以选中的点为中心做对称,将这\(m\)个操作按顺序执行\(k\)遍(\(1\)~\(m\)完整执行一次算\(1\)遍),求最终每个点的位置的期望值 Solution 不难发现根据期望的线性型,在\(a-1\)和\(a+1\)之间随机选一个进行对称操作的期

AGC006做题小记

比赛链接:AGC006 C.Rabbit Exercise 题意 有 n 只兔子,一开始第 i 只兔子位于 x[i] .有 m 次操作,第 i 次操作给定 ai, 表示让第 a[i] 只兔子等概率选择 a[i] - 1 或 a[i] + 1 中的一只兔子,跳到它相对于那只兔子的对称点. 要求你输出重复这 m 个操作 k 次之后, 每只兔子坐标的期望. 3 ≤ N, M ≤ 100000 1 ≤ K ≤ 1018 题解 800分比1500分难系列 x 关于 y 对称做一次跳跃会跳到 2y - x

hdu 5030 Rabbit&#39;s String(后缀数组&amp;二分)

Rabbit's String Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 288    Accepted Submission(s): 108 Problem Description Long long ago, there lived a lot of rabbits in the forest. One day, the

Exercise: Maps (单词统计)

A Tour of Go Exercise: Maps https://tour.golang.org/moretypes/23 WordCount (单词统计) 是一个很经典的小程序了,在很多编程入门教程中都会出现. 这道题比较简单,但也有一些知识点值得一提. 上面这个答案我是参考了网上别人写的.但在参考别人之前我也自己解题了,其中,唯一不同之处是这一句: m[word]++ 我本来写的是: _, ok := m[word] if ok { m[word]++ } else { m[word]

Exercise: Slices (画图)

A Tour of Go Exercise: Slices https://tour.golang.org/moretypes/18 这道题目,提供了一个画图函数 (pic.Show), 可以生成图片. 这个函数,即 pic.Show(f func(int, int) [][]uint8), 可见,它接受一个函数做参数,题目要求的正是编写这个参数.答案如下: 这里面,依赖一个 package, 即 "golang.org/x/tour/pic" 我上 https://github.co

Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2)及总结

Exercise 1:Linear Regression---实现一个线性回归 关于如何实现一个线性回归,请参考:http://www.cnblogs.com/hapjin/p/6079012.html Exercise 2:Logistic Regression---实现一个逻辑回归 问题描述:用逻辑回归根据学生的考试成绩来判断该学生是否可以入学. 这里的训练数据(training instance)是学生的两次考试成绩,以及TA是否能够入学的决定(y=0表示成绩不合格,不予录取:y=1表示录

HDU4057 Rescue the Rabbit(AC自动机+状压DP)

题目大概是给几个DNA片段以及它们各自的权值,如果一个DNA包含某个片段那么它的价值就加上这个片段的权值,同时包含多个相同DNA片段也只加一次,问长度l的DNA可能的最大价值. 与HDU2825大同小异. dp[i][j][S]表示长度i(自动机转移i步).后缀状态为自动机第j个结点.包含的DNA片段为集合S 的DNA最大价值 dp[0][0][0]=0 我为人人转移,从dp[i][j][S]向ATCG四个方向更新dp[i+1][j'][S'] 注意的是要用滚动数组,不然要开上百兆数组. 用滚动