题解-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\)之间随机选一个进行对称操作的期望等价于在\(a-1\)和\(a+1\)的中点处进行对称

则我们发现,对于点\(B\)在点\(A\)和\(C\)之间,若\(A\)到\(B\)距离为\(a\),若\(B\)到\(C\)距离为\(b\),则对称后的位置\(B‘\)与\(A\)距离为\(b\),与\(C\)距离为\(a\)(如下图)

发现如果我们用一个差分数组\(d_i=a_{i+1}-a_i\)存下\(a_i\)数组的话,对称操作相当于交换\(d_i,d_{i+1}\)

发现进行一轮操作后,整个序列会成为若干个对换环(一个对换环相当于将整个环旋转一格再重新赋值),而进行\(k\)次操作相当于将所有环旋转\(k\)格

发现如果整个环的大小为\(c\),则环旋转\(k\)次和旋转\(k\bmod c\)次是等价的,则复杂度与\(k\)无关,整体复杂度\(O(n+m)\)

Code

#include <algorithm>
#include <cstdio>
#include <cctype>
using namespace std;
typedef long long ll;
#define rg register

template <typename _Tp> inline _Tp read(_Tp&x){
    char c11=getchar(),ob=0;x=0;
    while(c11^‘-‘&&!isdigit(c11))c11=getchar();if(c11==‘-‘)ob=1,c11=getchar();
    while(isdigit(c11))x=x*10+c11-‘0‘,c11=getchar();if(ob)x=-x;return x;
}

const int N=101000;
int a[N],vis[N],st[N];
ll b[N],p[N],k;
int n,m,tp;

void init();void work();void print();
int main(){init();work();print();return 0;}

void work(){
    int x;
    for(rg int i=1;i<=m;++i)read(x),swap(a[x],a[x+1]);
    for(rg int i=1;i<=n;++i)if(!vis[i]){
        vis[st[0]=x=i]=tp=1;
        while(!vis[a[x]])
            vis[st[tp++]=x=a[x]]=1;
        int e=k%tp;
        for(rg int j=0;j<tp;++j)
            b[st[j]]=p[st[j+e<tp?j+e:j+e-tp]];
    }
}

void print(){
    ll sm(0ll);
    for(rg int i=1;i<=n;++i)
        printf("%lld\n",sm+=b[i]);
}

void init(){
    read(n);
    for(rg int i=1;i<=n;++i)read(p[i]),a[i]=i;
    for(rg int i=n;i;--i)p[i]-=p[i-1];
    read(m),read(k);
}

原文地址:https://www.cnblogs.com/penth/p/9768713.html

时间: 2024-10-31 21:02:04

题解-AtCoder-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\) ,则

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 ABC 161] A,B,C

题解 [Atcoder ABC 161] A,B,C A: 水题,按题意模拟即可. code: #include<bits/stdc++.h> #define ft(i,l,r) for(register int i=l;i<=r;i++) #define fd(i,r,l) for(register int i=r;i>=l;i--) using namespace std; int a,b,c; int main() { cin>>a>>b>>

[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 ARC-078F Mole and Abandoned Mine

problem ATC-arc078F 题意概要:给定一个 \(n\) 点 \(m\) 边简单无向图(无自环无重边),边有费用,现切去若干条边,使得从 \(1\) 到 \(n\) 有且仅有一条简单路径,求最小化花费. \(n\le 15, n-1\le m\le \binom n2\) Solution 看到 \(n\leq 15\) 大概就能猜到复杂度是 \(O(3^n)\) 左右的,然后直接思考用斯坦纳树咋解,无果. 开始思考最终局面的情况,一定是有一条 \(1\) 到 \(n\) 的路径,

题解 AtCoder abc154 F

题目大意 令 \(f(r,c)=C_{r+c}^r\),要求输出 \(\sum_{i=r_1}^{r_2}\sum_{j=c_1}^{c_2} f(i,j)\),其中 \(r_2,r_2,c_1,c_2\) 为给定值. 分析 令 \[g(r,c)=\sum_{i=0}^r\sum_{j=0}^c f(i,j)\] 则题目所求为 \[\sum_{i=r_1}^{r_2}\sum_{j=c_1}^{c_2} f(i,j)=g(r_2,c_2)-g(r_2,c_1-1)-g(r_1-1,c_2)+g(

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

[AtCoder][ARC082]Sandglass 题解

Sandglass 时间限制: 1 Sec 内存限制: 128 MB 原题链接 https://arc082.contest.atcoder.jp/tasks/arc082_d 题目描述 We have a sandglass consisting of two bulbs, bulb A and bulb B. These bulbs contain some amount of sand. When we put the sandglass, either bulb A or B lies

AtCoder Beginner Contest 115 题解

题目链接:https://abc115.contest.atcoder.jp/ A Christmas Eve Eve Eve 题目: Time limit : 2sec / Memory limit : 1024MB Score : 100 points Problem Statement In some other world, today is December D-th. Write a program that prints Christmas if D=25, Christmas E