time limit: 10 sec memory limit: 128 mb
submit: 6058 solved: 2117
[submit][status][discuss]
對於序列a,它的逆序對數定義為滿足i
>aj
的數對(i,j)的個數。給1到n的乙個排列,按照某種順序依次刪除m個元素,你的任務是在每次刪除乙個元素之前統計整個序列的逆序對數。
輸入第一行包含兩個整數n和m,即初始元素的個數和刪除的元素個數。以下n行每行包含乙個1到n之間的正整數,即初始排列。以下m行每行乙個正整數,依次為每次刪除的元素。
輸出包含m行,依次為刪除每個元素之前,逆序對的個數。
5 4153
4251
4252
21樣例解釋
(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。
n<=100000 m<=50000
題解:普通的樹狀陣列,無法記錄位置,不能知道一次之後記錄的是所以位置的資訊,
一次刪除的時候,不能知道哪些值是比它小的,因為位置的影響,
所以需要樹套樹,在開一層位置,這樣就可以了,動態開點,n logn log n的空間複雜度。
1 #include2 #include3 #include4 #include5 #include67#define n 100007
8#define m 10000007
9using
namespace
std;
10int
n,m,cnt;
11int
a[n],id[n],bit[n],lson[m],rson[m],tree[m];
12long
long
ans;
1314
int lowbit(int x)
15void addy(int &u,int l,int r,int x,int
y)16
19int mid=(l+r)>>1;20
if(x<=mid) addy(lson[u],l,mid,x,y);
21else addy(rson[u],mid+1
,r,x,y);
22 tree[u]=tree[lson[u]]+tree[rson[u]];23}
24void addx(int x,int y,int
val)
2529
int queryy(int u,int l,int r,int i,int
j)30
38int queryx(int x,int l,int
r)39
45int
main()
4655
while(m--)
5664 }
bzoj3295 動態逆序對
portal bzoj3295 雖然說這個可能原本是一道愉快的樹套樹但是 看到 按照某個順序依次刪除 這樣的字眼,比較容易聯想到乙個套路 反過來看,變成按照某個順序依次插入 那麼對於乙個詢問,刪掉它之前 化完了之後就是插入它之後 的所會影響到的逆序對數可以分為兩種 一種是在它前面但是比它大的,一種是...
BZOJ3295 動態逆序對
問題描述 對於序列a,它的逆序對數定義為滿足i j,且ai aj的數對 i,j 的個數。給1到n的乙個排列,按照某種順序依次刪除m個元素,你的任務是在每次刪除乙個元素之前統計整個序列的逆序對數。輸入格式 輸入第一行包含兩個整數n和m,即初始元素的個數和刪除的元素個數。以下n行每行包含乙個1到n之間的...
bzoj3295 動態逆序對(CDQ分治)
time limit 10 sec memory limit 128 mb submit 7178 solved 2548 submit status discuss 對於序列a,它的逆序對數定義為滿足iaj的數對 i,j 的個數。給1到n的乙個排列,按照某種順序依次刪 除m個元素,你的任務是在每次...