題意:利用樹狀陣列求逆序數;
思路:因為輸入範圍較大,先離散化一下,得到的陣列a記錄了原來陣列的大小關係;然後按下標順序執行add(a[i],1),這樣sum(a[i])得到的就是小於等於a[i]的個數,i-sum(a[i])即為a[i]前面比a[i]大的數的個數 //外迴圈n次並累加i-sum(a[i])得到逆序數
1 #include2 #include3 #include4 #include5using
namespace
std;
6 typedef long
long
ll;7
8struct
nodea[500050
];11
12bool
cmp(node a, node b)
1516
int aa[500050],c[500050
];17
intn;
1819
int lowbit(int
x)20
2324
int sum(int
x)30
return
ret;31}
3233
void add(int x, int
d)37}38
39int
main()
4048 sort(a+1,a+n+1
,cmp);
49for(int i = 1; i <= n; ++i)
5053 memset(c,0,sizeof
(c));
54 ll ans = 0;55
for(int i = 1; i <= n; ++i)
5660 printf("
%lld\n
",ans);61}
62return0;
63 }
poj2299 樹狀陣列入門題
題意 利用樹狀陣列求逆序數 思路 因為輸入範圍較大,先離散化一下,得到的陣列a記錄了原來陣列的大小關係 然後按下標順序執行add a i 1 這樣sum a i 得到的就是小於等於a i 的個數,i sum a i 即為a i 前面比a i 大的數的個數 外迴圈n次並累加i sum a i 得到逆序...
poj 2299 樹狀陣列
題目大意 本題要用到樹狀陣列的離散化處理,因為資料太大 1 999999999 但還是wa了兩次,c i 的範圍計算錯誤,要用到long long 從後向前處理,每次處理乙個數,求比這個數小的個數。poj 2299 樹狀陣列 include include include include inclu...
POJ 2299 樹狀陣列入門 離散化入門
思路見注釋,套兩個模板就好,沒什麼技巧 理解了快速排序的時間複雜度 不難發現這道題是乙個 純樹狀陣列 逆序對 直接套模板就好了 樹狀陣列每個結點存放的是小於等於該結點的value 逆序對公式 逆序對 大於該value的個數 因為樹狀陣列的n取決於序列的最大值 所以套個離散化模板就好了 離散化模板為不...