P1347 CQOI2011 動態逆序對

2022-05-05 01:36:10 字數 1766 閱讀 5586

對於序列a,它的逆序對數定義為滿足i<j,且ai>aj的數對(i,j)的個數。給1到n的乙個排列,按照某種順序依次刪除m個元素,你的任務是在每次刪除乙個元素之前統計整個序列的逆序對數。

輸入第一行包含兩個整數n和m,即初始元素的個數和刪除的元素個數。

以下n行每行包含乙個1到n之間的正整數,即初始排列。以下m行每行乙個正整數,依次為每次刪除的元素。

輸出包含m行,依次為刪除每個元素之前,逆序對的個數。

5 4

1 5

3 4

2 5

1 4 2

5 2

2 1

樣例解釋

(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。

資料規模:

n<=100000 , m<=50000

耒陽大視野,cqoi

主席樹, 分治 ,可持久化, 分塊 ,陳丹琦分治

思路從後開始,化刪去為插入;

求解即可

}反思:該題真正體現了cdq

分治的離線分治的思想。需要多加體會!

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include

11#define maxx 100001

12#define ll long long

13#define rg register

14#define lowbit(k) k&-k

15using

namespace

std;

16ll n,m,tot,t,a[maxx],pos[maxx],v[maxx],tree[maxx],col[maxx];

17struct

nodeq[maxx];

20ll ans[maxx];

21//

sort

22bool comp1(const node & x,const node & y)

23bool comp2(const node & x,const node & y)

24//

shuzhuangshuzu

25void

add(ll k)30}

31ll sum(ll k)

36//

cdqfenzhi

37void cdq(int l,int

r)t++;

47 sort(q+l,q+mid+1

,comp2);

48 sort(q+mid+1,q+r+1

,comp2);

49for(j=l,i=mid+1;i<=r;i++)

53 ans[q[i].id]+=sum(q[i].d);54}

55}56int

main()

63for(rg int i=1;i<=m;i++)

70for(rg int i=1;i<=n;i++) if(!v[i])

75 cdq(1,n);//

yi jing an shi jian pai wan xu

76for(rg int i=1;i<=n;i++) ans[i]+=ans[i-1

];77

for(rg int i=n;i>n-m;i--) printf("

%lld\n

",ans[i]);

78return0;

79 }

P3157 CQOI2011 動態逆序對

題目描述 現在給出 1 n 的乙個排列,按照某種順序依次刪除 m 個元素,你的任務是在每次刪除乙個元素之前統計整個序列的逆序對數。輸入格式 第一行包含兩個整數 n和 m,即初始元素的個數和刪除的元素個數。以下 n 行,每行包含乙個 1 n 之間的正整數,即初始排列。接下來 m 行,每行乙個正整數,依...

P3157 CQOI2011 動態逆序對

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

P3157 CQOI2011 動態逆序對

傳送門 設 val i 為位置 i 的值 維護 ansl i 表示位置 i 的數左邊所有大於 val i 的數的數量 維護 ansr i 表示位置 i 的數右邊所有小於 val i 的數的數量 考慮先求出一開始總的逆序對數 ans 每次刪除乙個數 位置為 p 就把 ans 減去 ansl p ans...