日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

hdu 5497 Inversion(树状数组)

發(fā)布時(shí)間:2025/3/16 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 5497 Inversion(树状数组) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=5497

解題思路:

用樹(shù)狀數(shù)組維護(hù)一段區(qū)間L,區(qū)間長(zhǎng)度為m,依次枚舉該區(qū)間的終點(diǎn)ai,即將該點(diǎn)加入到區(qū)間L來(lái),把a(bǔ)i-m從原來(lái)的L中刪除;

ai+m,對(duì)數(shù),對(duì)數(shù)?

ai,,對(duì)數(shù),對(duì)數(shù)?

這里用到了兩個(gè)樹(shù)狀數(shù)組,比較難理解。

#include<iostream> #include<cstdio> #include<cstring> using namespace std;const int maxn = 100005; struct Tree {int n,c[maxn];void init(int n){this->n = n;memset(c,0,sizeof(c));}int lowbit(int x){return x & -x;}void add(int i,int d){while(i <= n){c[i] += d;i += lowbit(i);}}int sum(int x){int ans = 0;while(x){ans += c[x];x -= lowbit(x);}return ans;} }L,R; int n,m,a[maxn];int main() {int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i = 1; i <= n; i++)scanf("%d",&a[i]);L.init(n);R.init(n);long long tmp = 0,ans;for(int i = m + 1; i <= n; i++){tmp += i - m - 1 - R.sum(a[i]);R.add(a[i],1);}ans = tmp;for(int i = m + 1; i <= n; i++){tmp -= R.sum(a[i]-1);tmp -= L.sum(n) - L.sum(a[i]);R.add(a[i],-1);tmp += R.sum(a[i-m]-1);tmp += L.sum(n) - L.sum(a[i-m]);L.add(a[i-m],1);ans = min(ans,tmp);}printf("%lld\n",ans);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的hdu 5497 Inversion(树状数组)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。