單點更新
void update(int x,int y,int區間查詢(1 - x)n)
int getsum(int對於陣列a,我們將其離散化處理為b.區間查詢與單點修改**如下x)
int lowbit(inta的逆序對個數為:x) void update(int
p) }
int getsum(int
p)
return
res;
}
for(int i = 1; i <= n; i++)poj 2299
#include#includeview code#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;#define bug printf("*********\n")
#define debug(x) cout<
int maxn = 5e5 + 10
;const
double eps = 1e-8
;int
c[maxn];
intn;
inta[maxn],b[maxn];
int lowbit(int
x) void update(int
p) }
int getsum(int
p)
return
res;
}int
main()
sort(a + 1, a + 1 +n);
int cnt = unique(a + 1, a + 1 + n) - a - 1
;
for (int i = 1; i <= n; i++)
b[i] = lower_bound(a + 1, a + 1 + cnt, b[i]) -a;
ll res = 0
;
for(int i = 1; i <= n; i++)
printf(
"%lld\n
",res);}}
res就是逆序對個數,ask,需注意b[i]應該大於0
用這個做區間修改區間求和的題,無論是時間上還是空間上都比帶lazy標記的線段樹要優。
樹狀陣列模版
1.一維樹狀陣列 獲得2 k public static int lowbit int i 修改結點 public static void add int i,int value 求和 public static int getsum int i return sum 2.二維樹狀陣列 public...
樹狀陣列模版
單點更新,區間求和 include include using namespace std const intmaxn 1e6 1 inta maxn c maxn intmaxnum 1e6 intlowbit intx intsum intx return res void add intx,i...
樹狀陣列模版
原來聽到樹狀陣列這名字感覺很難,很高大上。學了一下發現不難。而且很好。普通的陣列修改某個值耗費為o 1 輸出和為o n 而樹狀陣列為o logn lowbit x 返回的是x二進位制最後一位1的位置 有公式 cn a n a k 1 an 其中 k 為 n 的二進位制表示中從右往左數的 0 的個數 ...