説明
シャフトを立っウサギの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;
}