【AGC006 C】Rabbit Exercise
题意 有 (n) 只兔子在数轴上,第 (i) 只兔子的初始坐标为整数 (x_i)。 题解 设某个时刻第 (i) 只兔子的期望坐标为 (f_i),则第 (i) 只兔子跳跃后,期望坐标为 (f_i' = frac{1}{2} (2f_{i-1}-f_i) + frac{1}{2} (2f_{i+1}-f_i) = f_{i-1}+f_{i+1}-f_i) 故我们可以把 (a_j) 转化成差分形式,然后加速做 (k) 次体操。 #include<bits/stdc++.h> #define ll long long #define N 100002 using namespace std; inline ll read(){ ll x=0; bool f=1; char c=getchar(); for(;!isdigit(c); c=getchar()) if(c=='-') f=0; for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+(c^'0'); if(f) return x; return 0-x; } int n,m; ll k; ll a[100010]; int vis[N],to[N],cir[N]; ll ans[100010]; int main(){ n=read(); ll lst=0; for(int i=1; i<=n; i++){ a[i]=read()-lst; lst+=a[i]; to[i]=i; } m=read(),k=read(); int x; for(int i=1; i<=m; i++) x=read(),swap(to[x],to[x+1]); for(int i=1; i<=n; i++) if(!vis[i]){ int cnt=0,j; for(j=i; !vis[j]; j=to[j]) vis[j]=1,cir[++cnt]=j; for(j=1; j<=cnt; j++) ans[cir[j]] = a[cir[(j+k-1)%cnt+1]]; } for(int i=1; i<=n; i++){ printf("%lld.0n",ans[i]+=ans[i-1]); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |