CodeForces 645 B.Mischievous Mess Makers(水~)

来源:互联网 发布:淘宝达人自媒体认证 编辑:程序博客网 时间:2024/05/16 14:44

Description
1~n按顺序排好组成一个序列,每次操作可以交换任意两个数位置,问经过不超过k次操作得到的新序列的逆序对数最大值
Input
两个整数n和k(1<=n,k<=1e5)
Output
输出移动k个数后得到新序列的最大逆序对数
Sample Input
5 2
Sample Output
10
Solution
至多经过n/2次交换就可以把序列变成n~1,所以首先令k=min(k,n/2),之后第i次把第i大的数和第i小的数交换,产生2*(n-2*i)+1个逆序对
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 1111int main(){    int n,k;    while(~scanf("%d%d",&n,&k))    {        ll ans=0;        k=min(k,n/2);        for(int i=1;i<=k;i++)ans+=2*(n-2*i)+1;        printf("%I64d\n",ans);    }    return 0;}
0 0