對於序列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 #include11#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...