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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hdu2492 数状数组或者线段树

發布時間:2025/6/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu2492 数状数组或者线段树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?給你一些人,每個人有自己的攻擊力,輸入的順序就是每個人的順序,他們之間互相比賽,兩個人比賽的條件是必須在他們兩個位置之間找到一個人當裁判,這個裁判的攻擊力必須在他們兩個人之間,問你最多能矩形多少場比賽。

思路:

? ? ? 枚舉每一個點當裁判,線段樹或者樹狀數組正著跑一遍記錄大于等于當前點和小于等于當前點的個數,然后倒著跑一邊,做同樣處理,最后乘一下就行了。


#include<stdio.h> #include<string.h> __int64 num[110000] ,G[110000]; __int64 L1[110000] ,R1[110000] ,L2[110000] ,R2[110000];int lowbit(int x) {return x & -x; }void update(int x ,__int64 a) {for(int i = x ;i <= 100050 ;i += lowbit(i))num[i] += a; }__int64 get_sum(int x) {__int64 sum = 0;for(int i = x ;i > 0 ;i -= lowbit(i))sum += num[i];return sum; }int main () {int i ,t ,n;scanf("%d" ,&t);while(t--){scanf("%d" ,&n);for(i = 1 ;i <= n ;i ++)scanf("%I64d" ,&G[i]);memset(num ,0 ,sizeof(num));for(i = 1 ;i <= n ;i ++){L1[i] = get_sum(G[i]);R1[i] = get_sum(100005) - get_sum(G[i] - 1);update(G[i] ,1);}memset(num ,0 ,sizeof(num));for(i = n ;i >= 1 ;i --){L2[i] = get_sum(G[i]);R2[i] = get_sum(100005) - get_sum(G[i] - 1);update(G[i] ,1);}__int64 sum = 0;for(i = 1 ;i <= n ;i ++)sum += L1[i] * R2[i] + L2[i] * R1[i];printf("%I64d\n" ,sum);}return 0; }

總結

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

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