poj 2299 樹狀陣列離散化逆序數 水

2021-06-10 02:01:27 字數 2043 閱讀 1571

#include#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define iinf 2000000000

#define linf 1000000000000000000ll

#define dinf 1e200

#define eps 1e-5

#define all(v) (v).begin(),(v).end()

#define sz(x) x.size()

#define pb push_back

#define mp make_pair

#define lng long long

#define sqr(a) ((a)*(a))

#define pii pair#define pll pair#define pss pair#define pdd pair#define x first

#define y second

#define pi 3.14159265359

#define ff(i,xi,n) for(int i=xi;i<=(int)(n);++i)

#define ffd(i,xi,n) for(int i=xi;i>=(int)(n);--i)

#define ffl(i,r) for(int i=head[r];i!=-1;i=edge[i].next)

#define cc(i,j) memset(i,j,sizeof(i))

#define two(x) ((lng)1<<(x))

#define n 500000

#define m 1000000

#define lson l , mid , rt << 1

#define rson mid + 1 , r , rt << 1 | 1

#define mod n

#define pmod(x) (x%mod+mod)%mod

using namespace std;

typedef vectorvi;

typedef vectorvs;

typedef unsigned int uint;

typedef unsigned lng ulng;

templateinline void checkmax(t &x,t y)

templateinline t min(t x,t y)

templateinline t max(t x,t y)

templatet lcm(t a,t b)

templatet abs(t a)

templateinline t lowbit(t n)

templateinline int countbit(t n)

templateinline bool isprimenumber(t n)

struct pp

a[n];

int n,newval[n],sum[n];

inline void update(int x,int add)

}inline int get(int x)

bool cmp(pp p,pp q)

int main()

sort(a+1,a+1+n,cmp);

int index=0;

a[0].val=iinf;

ff(i,1,n)

if(a[i].val!=a[i-1].val)

newval[a[i].id]=++index;

else

newval[a[i].id]=newval[a[i-1].id];

cc(sum,0);

lng res=0;

ffd(i,n,1)

res+=get(newval[i]-1),update(newval[i],1);

printf("%i64d\n",res);

}return 0;

}

POJ 2299(樹狀陣列,離散化)

題意 求逆序數 題解 可以將數字插入樹狀陣列,每次統計比單前數字小的個數,我們將每個數字的權值設定為1,那麼只要求在他前面數字的和就知道了,對應的逆序數格個數是i sum a i 這裡使用樹狀 陣列維護區間和 這一題由於數字範圍過大,記憶體無法承受如此大的空間,我們可以看到n最多才5e5,所以最多有...

poj 2299 樹狀陣列 離散化

樹狀陣列求逆序數 離散化 求逆序數時,加入當前數字,然後統計大於當前數字的數字個數,題目資料很大,需先將其離散化。include include include define n 500005 define lowbit x x x using namespace std int c n a n s...

POJ 2299 樹狀陣列,離散化

題目大意 求一組數的逆序數有多少個 題目解析 用樹狀陣列做,向下更新,向上求和,因為資料範圍太大,但是每個數都不一樣所以先離散化一下 ac include include include include includeusing namespace std typedef long long ll ...