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\) ,则 \(\frac{a_i+x}{2}=a_{i-1}\) 或 \(a_{i+1}\) ,即 \(x=2a_{i-1}-a_i\) 或 \(2a_{i+1}-a_i\) ,两式相加得 \(x=a_{i-1}+a_{i+1}-a_i\) ,即为变换后坐标期望值。

考虑类似题目 CF1110E Magic Stones 的做法,将原序列差分得到 \(c_i\) ,可以发现对 \(a_i\) 的变换相当于交换了 \(c_i,\ c_{i+1}\)

可以发现 \(k\) 轮操作相对顺序不影响答案,由于变换两次相当于变换一次后再变换一次,变换四次相当于变换两次后再变换两次,于是可以考虑倍增

可以 \(O(n)\) 求出一轮操作后差分数组的排列,倍增的预处理可以用排列完成

时间复杂度 \(O(k\log n)\)

代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int maxn = 1e5 + 10;
ll k, a[maxn];
int n, m, data[maxn], pos[61][maxn];

int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%lld", a + i), data[i] = i;
  }
  scanf("%d %lld", &m, &k);
  for (int i = 1, x; i <= m; i++) {
    scanf("%d", &x);
    swap(data[x], data[x + 1]);
  }
  for (int i = 1; i <= n; i++) {
    pos[0][i] = data[i];
  }
  for (int i = 1; i < 61; i++) {
    for (int j = 1; j <= n; j++) {
      pos[i][j] = pos[i - 1][pos[i - 1][j]];
    }
  }
  for (int i = 1; i <= n; i++) {
    data[i] = i;
  }
  for (int p = 60; ~p; p--) {
    if (k >> p & 1) {
      for (int i = 1; i <= n; i++) {
        data[i] = pos[p][data[i]];
      }
    }
  }
  static int c[maxn];
  for (int i = 1; i <= n; i++) {
    c[i] = a[i] - a[i - 1];
  }
  for (int i = 1; i <= n; i++) {
    a[i] = a[i - 1] + c[data[i]];
    printf("%lld\n", a[i]);
  }
  return 0;
}

原文地址:https://www.cnblogs.com/Juanzhang/p/11067783.html

时间: 2024-11-13 05:45:31

AT2164 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})+\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 <bit

[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'] 注意的是要用滚动数组,不然要开上百兆数组. 用滚动