【BZOJ】3295: [Cqoi2011]动态逆序对

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3295


mamaya,弱鸡xrdog终于会写树套树啦....

 

将树状数组中每一个节点看成一棵平衡树,支持$RANK$操作,每次删除一个数之前,支持查询位置在当前数之前权值比他大的有多少个,查询位置在当前数之后权值比他小的有多少个,再支持删除操作。

复杂度${O(nlogn^{2})}$,空间复杂度${O(nlogn)}$

 


 1 #include<iostream>
 2 #include<ext/pb_ds/assoc_container.hpp>  
 3 #include<cstdio>
 4 #include<algorithm>
 5 #include<vector>
 6 #include<cstdlib>
 7 #include<cmath>
 8 #include<cstring>
 9 #include<set>
10 using namespace std;
11 using namespace __gnu_pbds;  
12 #define maxn 1001000
13 #define llg long long
14 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
15 llg n,m,d[maxn],ans,wz[maxn],v;
16 tree<llg,null_type,less<llg>,rb_tree_tag,tree_order_statistics_node_update>c[maxn];  
17 
18 //tree<llg,null_mapped_type,less<llg>,rb_tree_tag,tree_order_statistics_node_update>c[maxn];  //-----如果您的编译器版本较低(BZOJ)
19 llg cc[maxn];
20 inline llg lowbit(llg x){return x&-x;}
21 
22 void add(llg x,llg val)  {while (x<=n) {c[x].insert(val);x+=lowbit(x);}}
23 
24 void del(llg x,llg val)  {while (x<=n) c[x].erase(val),x+=lowbit(x);}
25 
26 void add_(llg x,llg val) {while (x<=n) cc[x]+=val,x+=lowbit(x);}
27 
28 llg sum_(llg x) {llg tot=0; while (x>0) tot+=cc[x],x-=lowbit(x); return tot;}
29 
30 llg sum(llg x,llg val)
31 {
32     llg tot=0;
33     while (x>0)
34     {
35         tot+=c[x].size();
36         llg xiao=c[x].order_of_key(val+1);
37         tot-=xiao;
38         x-=lowbit(x);
39 }return tot;
40 }
41 
42 llg summ(llg x,llg val)
43 {
44     llg tot=0;
45     while (x>0)
46     {
47         tot+=c[x].order_of_key(val+1);
48         x-=lowbit(x);
49     }
50     return tot;
51 }
52 
53 void init()
54 {
55     cin>>n>>m;
56     for (llg i=1;i<=n;i++) 
57     {
58         scanf("%lld",&d[i]);
59         wz[d[i]]=i;
60         ans+=sum_(n)-sum_(d[i]);
61         add_(d[i],1);
62         add(i,d[i]);
63     }
64 
65 }
66 
67 void work()
68 {
69     llg x,da,xiao;
70     while (m--)
71     {
72         printf("%lld\n",ans);
73         scanf("%lld",&v);
74         x=wz[v];
75         da=sum(x,v);
76         xiao=summ(n,v)-summ(x,v);
77         ans-=da+xiao;
78         del(x,v);
79     }
80 }
81 
82 int main()
83 {
84     yyj("bzoj3295");
85     init();
86     work();
87     return 0;
88 }

 

posted @ 2017-02-27 08:58  №〓→龙光←  阅读(235)  评论(0编辑  收藏  举报