Cqoi2011 BZOJ3295 動態逆序對

2021-07-15 20:06:38 字數 1295 閱讀 6260

對於序列a,它的逆序對數定義為滿足i

樹狀陣列

一看到逆序對就要想到樹狀陣列。

維護每個數前面到目前有多少個比自己大。

動態的思路

因為要動態維護,每次只刪掉乙個數在逆序對中的貢獻:及每個數前面有多少個比自己大,每個數後面有多少數比自己小。

先預處理出每個數前面有多少個比自己大ll[i],每個數後面有多少個數比自己小rr[i]。

很顯然每次只用總答案刪掉位置為i的數,答案就減去ll[i]+rr[i]就可以了,但是有乙個問題。

如果已經刪掉了一些數在統計進答案裡面會重複刪減。

套上權值線段樹

那麼我們再把已經刪減的數用乙個資料結構來維護,因為要維護每個數前面與後面的答案,考慮字首和的思路,自然就是樹狀陣列了,然後在範圍內查詢個數,用權值線段樹就可以了。

#include

#include

#include

#include

#include

#define fo(i,a,b) for(i=a;i<=b;i++)

#define fod(i,a,b) for(i=a;i>=b;i--)

using

namespace

std;

typedef

long

long lll;

const

int maxn=100007;

int i,j,l,n,m,ll[maxn],rr[maxn],a[maxn],b[maxn];

int tree[maxn],root[maxn],num;

int a[maxn],b[maxn];

lll ans,k;

struct nodet[maxn*50];

int lowbit(int x)

int get(int x)

void add(int x)

void build(int &x,int l,int r,int y)

int zhaoda(int x,int y,int z)

else

}return k;

}int zhaoxiao(int x,int y,int z)

else

}return k;

}int main()

memset(tree,0,sizeof(tree));

fod(i,n,1)

fo(i,1,m)

}

bzoj3295 CQOI2011 動態逆序對

time limit 10 sec memory limit 128 mb submit 3122 solved 986 submit status discuss 對於序列a,它的逆序對數定義為滿足i aj 的數對 i,j 的個數。給1到n的乙個排列,按照某種順序依次刪除m個元素,你的任務是在每次...

bzoj3295 Cqoi2011 動態逆序對

傳送門 題解 cdq分治 我們仔細想一想維護逆序對的時候我們用的不就是歸併排序嗎?而歸併排序不就可以看作一種分治嗎?於是此題走上正軌,我們可以用分治來寫 怎麼寫?我們刪除乙個點,損失了什麼?1.這個點x之前比我大的個數記為big x 這個點x之後比我小的記作small x 那麼損失 small x ...

bzoj3295 Cqoi2011 動態逆序對

對於序列a,它的逆序對數定義為滿足 i j,且a i a j的數對 i,j 的個數。給1到 n的乙個排列,按照某種順序依次刪除 m個元素,你的任務是在每次刪除乙個元素之前統計整個序列的逆序對數。輸入第一行包含兩個整數 n和m,即初始元素的個數和刪除的元素個數。以下 n行每行包含乙個1到 n之間的正整...