【gdgzezoi】問題B:ウサギ演習

説明

シャフトを立っウサギのNの数があります。便宜上、ウサギは1 ... N.番号を付けました ウサギの初期位置は、私XIです。

今、これらのウサギは、以下の規則に従って演習のいくつかのセットを行います。各セットは、M体操ジャンプ組成物で構成され、j番目のジャンプ、AJ(2≤aj≤N-1)ウサギの確率などがランダム最初またはAJ-AJ 1 + 1はウサギであるを選択する場合(Xは、第1の選択ウサギをとることができる)、次いでX対称点ウサギ上の現在位置にジャンプ。

ウサギは体操K組の順で同じことをするでしょう。今、あなたは体操の後にK組の各ウサギの完成予想最終位置の座標を見つけます。
入力
標準入力と出力から、次の形式の入力中のタイトルのデータ:

N
のX1 X2 ... XN
MK
A1 A2 ...のaM
出力
合計N個の出力ライン。体操行わウサギのI I Kセットの最初の行為の所望の位置座標後。小数点の出力(四捨五入)。
入力サンプル
試料INPUT 1:
3
-1 0 2
1 1。
2

サンプル入力2:
3
1 -1 1
2 2
2 2

サンプル入力3:
5
0 1 3 6 10
3 10
2 3 4
サンプル出力
サンプル出力1:
-1.0
1.0
2.0

出力例2:
1.0
-1.0
1.0

出力例3:
0.0
3.0
7.0
8.0
10.0
HINT

  • 3≤N≤105
  • xiが整数です。
  • |西|≤109
  • 1≤M≤105
  • 2≤aj≤N-1
  • 1≤K≤1018

例1:

最初の二つのウサギは、一度ジャンプします。場合にのみ、最初に選択されたウサギ、スキップ先座標-2; 3匹のウサギを選択した場合、スキップ先座標4。したがって、第2のウサギは、最終的な座標を所望0.5×(-2)+ 0.5×4 = 1.0であります

サンプル2:

xiが同じであってもよいです。

思考

Xビットの差は交換X及びX + 1ビットに相当する一つのこのような動作を行います。我々は、交換にMのMなどの操作を指示する、これらの操作を1からnまでの代替として見ることができる行われます。私たちは、ライン上の各回転ステップ離れK内の各ポイントの真上に、その後、私たちに直接ダウン回転数に置き換え、そして。

コード

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100010],ans[100010];
int c[100010],b[100010],d[100010]; 
int main()
{
    int n;
    scanf("%d",&n);
    int i;
    ll sum=0;
    for(i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        a[i]-=sum;
        sum+=a[i];
        c[i]=i;
    }
    int m;
    ll k;
    scanf("%d%lld",&m,&k);
    int x;
    for(i=1;i<=m;i++)
    {
        scanf("%d",&x);
        swap(c[x],c[x+1]);
    }
    for(i=1;i<=n;i++)
        if(!b[i])
        {
            int cnt=0;
            int j;
            for(j=i;!b[j];j=c[j])
            {
                b[j]=1;
                d[++cnt]=j;
            }
            for(j=1;j<=cnt;j++)
                ans[d[j]]=a[d[(j+k-1)%cnt+1]];
        }
    for(i=1;i<=n;i++)
    {
        ans[i]+=ans[i-1];
        printf("%lld.0\n",ans[i]);
    }
    return 0;
}

703元記事公開 ウォンの賞賛392 ビューに14万+を

おすすめ

転載: blog.csdn.net/Eric1561759334/article/details/100808441