日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu4911 简单树状数组

發布時間:2025/6/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4911 简单树状数组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?給你一串數字,然后給你最多進行k次交換(只能交換相鄰的)問交換后的最小逆序數是多少。


思路:

? ? ?首先要知道的一個就是給你一個序列,每次只能交換相鄰的位置,把他交換成一個遞增序列所需要的最少步數等于整個序列的逆序數,在轉化到這個題目,我們只要求出個逆序數,然后輸出逆序數 - k就行了,如果是負數輸出0。


#include<stdio.h> #include<string.h> #include<algorithm>#define N 100000 + 10 using namespace std;typedef struct {int num ,id; }NODE;NODE node[N];__int64 num[N]; int hash[N]; int lowbit(int x) {return x & -x; }void update(int x ,__int64 a ,int n) {for(int i = x ;i <= n ;i += lowbit(i))num[i] += a; }__int64 find(int x) {__int64 sum = 0;for(int i = x ;i > 0 ;i -= lowbit(i))sum += num[i];return sum; }bool camp(NODE a ,NODE b) {return a.num < b.num; }int main () {int n ,i ,a;__int64 m ,sum;while(~scanf("%d %I64d" ,&n ,&m)){for(i = 1 ;i <= n ;i ++){scanf("%d" ,&node[i].num);node[i].id = i;}sort(node + 1 ,node + n + 1 ,camp);int t = 0;node[0].num = -1;for(i = 1 ;i <= n; i ++){if(node[i].num != node[i-1].num)t ++; hash[node[i].id] = t;}memset(num ,0 ,sizeof(num));for(sum = 0 ,i = 1 ;i <= n ;i ++){sum += (i - 1) - find(hash[i]);update(hash[i] ,1 ,t);}if(sum < m) printf("0\n");else printf("%I64d\n" ,sum - m);}return 0; }

總結

以上是生活随笔為你收集整理的hdu4911 简单树状数组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。