1),輸入n個值,求其中逆序對的個數:
1 #include2 #include3 #include4 #include5#define ll long long
6#define maxn 100005
7using
namespace
std;
8int
c[maxn],n;
9int low_bit(int
i)10
13void update(int i,int
v)1419}
20int get_sum(int
i)21
27return
res;28}
29int
main()
3040 printf("
%d\n
",ans);
41return0;
42 }
輸入n,m,表示有n個數和m個詢問,每個詢問輸入兩個數 l 和 r ,輸出 [l,r] 這個區間內的逆序對個數。
我們可以在每次詢問時通過移動區間的左右端點來維護結果:
1 #include2 #include3 #include4 #include5using
namespace
std;
6int c[300001],a[300001],rpos=0,lpos=1
,n,m,ans;
7void add(int x,int
d)12}13
int query(int
x)20
return
s;21}22
intmain()
2331 cin>>m;
32for (i=1;i<=m;i++)
39while (rpos>r)
44while (lpos/*
如果這個區間的左端點比原區間的右端點大,就減去從lpos到l-1這個區間內的數與其他數構成的逆序對
*/45 add(a[lpos],-1
);46 ans-=query(a[lpos]-1
);
47 lpos++;48}
49while (lpos>l)
54 printf("
%d\n
",ans);/*
ans肯定不清零哇
*/55
}56 }
完~~~~~~
樹狀陣列求逆序對
題目描述 給定乙個陣列a,它包含n個整數,分別是a 1 a 2 a n 如果存在下標i和j,使得 i j 且 a i a j 同時成立,則 i,j 就為乙個 逆序對 那麼a陣列總共有多少對不同的 逆序對 輸入格式 1247.in 第一行為n 1 n 100000 接下來是n行,每行乙個長整型範圍內的...
樹狀陣列求逆序對
很久以前就學了樹狀陣列,也知道可以用來求逆序對,然而一直沒弄明白他是怎麼實現的 可能當時沒搞清楚逆序對是什麼吧。逆序對就是如果i j a i a j 這兩個就算一對逆序對,簡單來說,所有逆序對的個數和就是找每乙個數的前面有幾個比他的大的數,他們加起來的和就是逆序對的總數。知道什麼是逆序對後就好辦了,...
樹狀陣列 求逆序對
樹狀陣列可以解決線段樹能夠解決的問題,且更加節省空間。線段樹的講解 可以看這位大佬的部落格 樹狀陣列的講解 另一位大佬的部落格 這裡主要寫一下利用樹狀陣列來求解逆序對的個數。簡單來說就是一段序列裡面每個數所在位置之前的位置上比這個數大的數字個數之和。例如 1 2 3 5 4 只有 4 前面的 有乙個...