【推导】AtCoder Regular Contest 082 D - Derangement
2017-09-03 12:50
459 查看
题意:给你一个排列a,每次可以交换相邻的两个数。让你用最少的交换次数使得a[i] != i。
对于两个相邻的a[i]==i的数,那么一次交换必然可以使得它们的a[i]都不等于i。
对于两个相邻的,其中一个a[i]==i,另一个a[i]!=i的数,一次交换也必然可以使得它们的a[i]都不等于i。
于是可以把序列划分成多段连续的a[i]==i的段落,它所贡献的交换次数就是[(长度+1)/2]。
对于两个相邻的a[i]==i的数,那么一次交换必然可以使得它们的a[i]都不等于i。
对于两个相邻的,其中一个a[i]==i,另一个a[i]!=i的数,一次交换也必然可以使得它们的a[i]都不等于i。
于是可以把序列划分成多段连续的a[i]==i的段落,它所贡献的交换次数就是[(长度+1)/2]。
#include<cstdio> using namespace std; int n,a[100005]; int main(){ // freopen("b.in","r",stdin); scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d",&a[i]); } int sta,ans=0; for(int i=1;i<=n;++i){ if((i==1 && a[i]==i) || (a[i]==i && a[i-1]!=i-1)){ sta=i; } if((i==n && a[i]==i) || (a[i]==i && a[i+1]!=i+1)){ ans+=(i-sta+2)/2; } } printf("%d\n",ans); return 0; }
相关文章推荐
- 【计算几何】【推导】【补集转化】AtCoder Regular Contest 082 E - ConvexScore
- 【推导】【模拟】AtCoder Regular Contest 082 F - Sandglass
- 【AtCoder Regular Contest 082】Derangement
- AtCoder Regular Contest 082 F
- AtCoder Regular Contest 082-E-ConvexScore
- 【AtCoder Regular Contest 082 F】Sandglass
- AtCoder Regular Contest 082 E - ConvexScore 乱搞
- AtCoder Regular Contest 082 E
- 【AtCoder Regular Contest 082 A】Together
- AtCoder Regular Contest 082
- AtCoder Regular Contest 082 ABCD
- AtCoder Regular Contest 082-F-Sandglass
- AtCoder Regular Contest D - Remainder Reminder 取余问题
- AtCoder Regular Contest 091 E - LISDL
- AtCoder Regular Contest 092 C - 2D Plane 2N Points 贪心 匈牙利算法模板
- AtCoder Regular Contest 093 D - Grid Components
- AtCoder Regular Contest 078 C
- AtCoder Regular Contest 059 F Unhappy Hacking
- AtCoder Regular Contest 066 E - Addition and Subtraction Hard
- AtCoder Regular Contest 067 F - Yakiniku Restaurants 乱搞