[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 回目のジャンプでは、うさぎ a_jaj? ( 2\ \leq\ a_j\ \leq\ N-12 ≤ aj? ≤ N−1 ) がジャンプします。 このとき、うさぎ a_j-1aj?−1 かうさぎ a_j+1aj?+1 のどちらかが等確率で選ばれ(これをうさぎ xx とします)、うさぎ a_jaj? はうさぎ xx に関して対称な座標へジャンプします。

以上の合計 MM 回のジャンプを 11 セット分の体操として、うさぎ達は KK セット分の体操を続けて繰り返します。 各うさぎについて、最終的な座標の期待値を求めてください。

输入格式:

The input is given from Standard Input in the following format:

  $ N $
  $ x_1 $     $ x_2 $     $ ... $     $ x_N $
  $ M $       $ K $
  $ a_1 $     $ a_2 $     $ ... $     $ a_M $  

输出格式:

Print N lines. The i -th line should contain the expected value of the coordinate of the eventual position of rabbit i after K sets are performed.

The output is considered correct if the absolute or relative error is at most 10−9 .

输入输出样例

输入样例#1:

3
-1 0 2
1 1
2

输出样例#1:

-1.0
1.0
2.0

输入样例#2:

3
1 -1 1
2 2
2 2

输出样例#2:

1.0
-1.0
1.0

输入样例#3:

5
0 1 3 6 10
3 10
2 3 4

输出样例#3:

0.0
3.0
7.0
8.0
10.0

输入样例#4:

3
-1 0 2
1 1
2

输出样例#4:

-1.0
1.0
2.0

输入样例#5:

3
1 -1 1
2 2
2 2

输出样例#5:

1.0
-1.0
1.0

输入样例#6:

5
0 1 3 6 10
3 10
2 3 4

输出样例#6:

0.0
3.0
7.0
8.0
10.0

制約

  • 3 ≤ N ≤ 105
  • xi? は整数である。
  • ∣xi?∣ ≤ 10^9
  • ≤ M ≤ 105
  • 2 ≤ aj? ≤ N−1
  • 1 ≤ K ≤ 10^18

Problem Statement

There are N rabbits on a number line. The rabbits are conveniently numbered 11 through N . The coordinate of the initial position of rabbit i is xi? .

The rabbits will now take exercise on the number line, by performing sets described below. A set consists of Mjumps. The j -th jump of a set is performed by rabbit aj? ( 2 ≤ aj? ≤ N−1 ).

For this jump, either rabbit aj?−1 or rabbit aj?+1 is chosen with equal probability (let the chosen rabbit be rabbit x ), then rabbit aj? will jump to the symmetric point of its current position with respect to rabbit x .

The rabbits will perform K sets in succession. For each rabbit, find the expected value of the coordinate of its eventual position after K sets are performed.

Constraints

  • 3 ≤ N ≤ 105
  • xi? is an integer.
  • ∣xi?∣ ≤ 10^9
  • 1 ≤ M ≤ 10^5
  • 2 ≤ aj? ≤ N−1
  • 1 ≤ K ≤ 10^18

Sample Explanation 1

うさぎ 2 がジャンプします。うさぎ 11 に関して対称な座標へジャンプすると、座標 −2 へ移動します。 うさぎ 33 に関して対称な座標へジャンプすると、座標 4 へ移動します。

よって、うさぎ 2 の最終的な座標の期待値は 0.5×(−2)+0.5×4=1.0 です。

Sample Explanation 2

x_ixi? は相異なるとは限りません。

Sample Explanation 4

Rabbit 22 will perform the jump. If rabbit 1 is chosen, the coordinate of the destination will be −2 . If rabbit 3 is chosen, the coordinate of the destination will be 4 . Thus, the expected value of the coordinate of the eventual position of rabbit 2 is 0.5×(−2)+0.5×4=1.0 .

Sample Explanation 5

xi? may not be distinct.

中文描述:

??只兔子排成了一行, 第??只兔子的初始位置为????.

兔子要进行锻炼, 每一轮包含??次跳跃, 第??次是兔子 ????(2≤????≤??−1)进行跳跃, 它会等概率的选择第????−1 或第????+1只兔子 (假设为??), 然后跳到当前位置关于??的 对称点上.

这??次跳跃重复进行了??轮, 求最终每只兔子坐标的期望.

解题方法:

第??只兔子跳过第??只兔子之后坐标变为2∗????−????, 是线性的.

所以设????为第??只兔子位置的期望, 这个式子也成立.

进行完一次跳跃后,????变成了1/2(2????−1-xi-1)+1/2(2????+1−????)=????−1+????+1−????.

设s??=????+1−????, 那么进行一次跳跃相当于交换s??和 s??-1.

????−1 xi ????+1 -> ????−1 ????−1+xi+1-xi xi+1

s数组: xi-xi-1 xi+1-xi-> xi+1-xi xi-xi-1

我们先手动做一轮,得到交换后对应的位置。考虑dfs一遍找到形成的交换环,对每只兔子在它的环上走k步,最后再把差分的值加上就好.

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;

const int maxn=1e5+15;
ll n,m,k,cnt;
ll vis[maxn],s[maxn],x[maxn],num[maxn],be[maxn],p[maxn],a[maxn];
vector <ll> q[maxn];
void dfs(ll x,ll dep)//找环
{
    num[x]=dep;vis[x]=1;be[x]=cnt;
    q[cnt].push_back(x);
    if (!vis[p[x]]) dfs(p[x],dep+1);
}
int main()
{
    scanf("%lld",&n);
    for (int i=1;i<=n;i++) scanf("%lld",x+i);
    for (int i=1;i<n;i++) s[i]=x[i+1]-x[i];//差分序列
    scanf("%lld%lld",&m,&k);
    for (int i=1;i<n;i++) p[i]=i;
    for (int i=1;i<=m;i++) {scanf("%lld",a+i);swap(p[a[i]],p[a[i]-1]);}//一次置换的结果,记录下一次置换兔子到哪了
    for (int i=1;i<n;i++) if (!vis[i]) {dfs(i,0);++cnt;}
    ll now=x[1];
    printf("%lld\n",now);
    for (int i=1;i<n;i++)
    {
        now+=s[q[be[i]][(num[i]+k)%q[be[i]].size()]];
        printf("%lld\n",now);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/xxzh/p/9343418.html

时间: 2024-10-28 10:47:47

[Atcoder Grand 006 C] Rabbit Exercise 解题报告 (期望DP)的相关文章

[BZOJ1026][SCOI2009]windy数 解题报告|数位dp

Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 一直还是有点怕数位DP的...包括今天做这道简单的小题也花了很久的时间处理细节. 首先大体的思路非常明显,定义一个DP f[i,j]表示第i位放数字j有多少种方法,可以通过前一位的一些满足的数字推出这一位. 但是如何来解决在某个数A的范围内呢...? 并且一旦前面的没有取满,这一位都是可以0..9任意取

CF749E Inversions After Shuffle 解题报告 (期望 树状数组)

E. Inversions After Shuffle 题意 有一个长 \(n\) 的排列, 随机选取一段区间进行随机全排列, 求排列后整个序列的逆序对期望个数. \((n \le 10^5)\). 思路 首先, 考虑一整个排列进行排序后的逆序对期望个数, 一共有 \(\frac{n(n-1)}{2}\) 对点, 每对点行程逆序对的概率为 \(\frac{1}{2}\) , 所以逆序对期望个数为 \(\frac{n(n-1)}{4}\). 那么, 我们就可以算出每个区间对答案的贡献, 长度为 \

openjudge 9277 堆木头的解题报告

openjudge 9277 堆木头的解题报告.DP-前缀和-优化.(重点).总时间限制: 1000ms 内存限制: 131072kB描述Daxinganling produces a lot of timber. Before loading onto trains, the timberjacks will place the logs to some place in the open air first. Looking from the sideway, the figure of a

Leetcode 115 Distinct Subsequences 解题报告

Distinct Subsequences Total Accepted: 38466 Total Submissions: 143567My Submissions Question Solution Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence of a string is a new string which is formed from

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

[noip2011]铺地毯(carpet)解题报告

最近在写noip2011的题,备战noip,先给自己加个油! 下面是noip2011的试题和自己的解题报告,希望对大家有帮助,题目1如下 1.铺地毯(carpet.cpp/c/pas) [问题描述]为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上.地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的