【树状数组】【尺取法】

来源:互联网 发布:常用建模软件 编辑:程序博客网 时间:2024/04/28 16:03





#include <iostream> // hdu5497#include <cstring>#include <stdio.h>#include <algorithm>using namespace std;#define lowbit(x) x&(-x)const int maxn = 1e5+10;int a[maxn];int t[2][maxn];  int n,m;  typedef long long ll;int sum(int mode,int x){    int ret = 0;    for(int i=x;i>0;i-=lowbit(i))    {        ret += t[mode][i];    }    return ret;}void update(int mode,int x,int val){    for(int i=x;i<=n;i+=lowbit(i))    {        t[mode][i] += val;    }}int main(){    int T;    scanf("%d",&T);    while(T--)    {        memset(t,0,sizeof(t));        scanf("%d%d",&n,&m);        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);        }        ll ans = 0;        for(int i=m+1;i<=n;i++)        {            ans += i-m-1 - sum(0,a[i]);            update(0,a[i],1);        }        ll ret = ans;        for(int i=m+1;i<=n;i++)        {            ans -= sum(0,a[i]-1);            ans -= sum(1,n)-sum(1,a[i]);            update(0,a[i],-1);            ans += sum(0,a[i-m]-1);            ans += sum(1,n)-sum(1,a[i-m]);            update(1,a[i-m],1);            ret = min(ret,ans);        }        printf("%I64d\n",ret);    }    return 0;}


0 0
原创粉丝点击