poj2299 ( bit )
生活随笔
收集整理的這篇文章主要介紹了
poj2299 ( bit )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
樹狀數組求逆序數,先排個序,從大到小往插,計算在他的前面有幾個比他大,就是他的逆序數。
(PS:最近對數量越來越不敏感了,老在這上面錯。多做題,不能斷啊)
1 #include <cstdio> 2 #include<algorithm> 3 #include <vector> 4 using namespace std; 5 typedef long long i64; 6 struct po 7 { 8 int num,ord; 9 } p[500050]; 10 int a[500050]; 11 template<typename T = int> 12 struct BIT { 13 vector<T> a; 14 void init(int n) { 15 vector<T>(n+1).swap(a); 16 } 17 void add(int i, T v) { 18 for(int j = i + 1; j < (int)a.size(); j = (j|(j-1)) + 1) { 19 a[j] += v; 20 } 21 } 22 T sum(int i) const { 23 T ret = T(); 24 for(int j = i; j > 0; j = j & (j-1)) { 25 ret += a[j]; 26 } 27 return ret; 28 } 29 T get(int i) const { 30 return sum(i+1) - sum(i); 31 } 32 void set(int i, T v) { 33 add(i, v - get(i)); 34 } 35 }; 36 int cmp(po a,po b) 37 { 38 if(a.num>=b.num) return 1; 39 else return 0; 40 } 41 int main( ) { 42 int n; 43 while( scanf("%d", &n) != EOF&&n ) 44 { 45 BIT<int> bit; 46 bit.init(n); 47 for(int i=0;i<n;i++) 48 { 49 scanf("%d",&p[i].num); 50 p[i].ord=i; 51 } 52 sort(p,p+n,cmp); 53 i64 summ=0; 54 for(int i=0;i<n;i++) 55 { 56 bit.set(p[i].ord,1); 57 summ+=bit.sum(p[i].ord); 58 } 59 printf("%lld\n",summ); 60 } 61 return 0; 62 }?
?
轉載于:https://www.cnblogs.com/Acgsws/p/3221893.html
總結
以上是生活随笔為你收集整理的poj2299 ( bit )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET后台调用前台JS函数的三种
- 下一篇: 一个简单的基于socket的通讯处理程序