【BZOJ3295】动态逆序对(BIT套动态加点线段树)
题意:对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。
给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。
N<=100000 M<=50000
思路:树套树即可,第i棵树维护前i位中1-j的个数,支持区间求和
外面要套BIT来实现区间加
本来维护剩下的数就可以,但初始化可能要开(n log^2 n) 个个节点,这题又只有128MB……
所以只能维护删除的数了,如果256MB乱搞就行了……
var t:array[..,..]of longint;
sum:array[..]of int64;
root,a,b,a1,a2,c:array[..]of longint;
n,m,i,x,cnt,l,r,j:longint;
ans:int64; procedure pushup(x:longint);
begin
l:=t[x,]; r:=t[x,];
sum[x]:=sum[l]+sum[r];
end; procedure update(l,r,x,v:longint;var p:longint);
var mid:longint;
begin
if p= then
begin
inc(cnt); p:=cnt;
end;
if l=r then
begin
sum[p]:=sum[p]+v; exit;
end;
mid:=(l+r)>>;
if x<=mid then update(l,mid,x,v,t[p,]);
if x>mid then update(mid+,r,x,v,t[p,]);
pushup(p);
end; function query(l,r,x,y,p:longint):int64;
var mid:longint;
begin
if p= then exit();
if (l>=x)and(r<=y) then exit(sum[p]);
mid:=(l+r)>>;
query:=;
if x<=mid then query:=query+query(l,mid,x,y,t[p,]);
if y>mid then query:=query+query(mid+,r,x,y,t[p,]);
pushup(p);
end; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; procedure change(i,j,v:longint);
var k:longint;
begin
k:=i;
while k<=n do
begin
update(,n,j,v,root[k]);
k:=k+lowbit(k);
end;
end; function getsum(x:longint):longint;
begin
getsum:=;
while x> do
begin
getsum:=getsum+c[x];
x:=x-lowbit(x);
end;
end; function ask(i,j,x,y:longint):int64;
var k:longint;
begin
ask:=;
if i>j then exit();
if x>y then exit();
k:=j;
while k> do
begin
ask:=ask+query(,n,x,y,root[k]);
k:=k-lowbit(k);
end;
k:=i-;
while k> do
begin
ask:=ask-query(,n,x,y,root[k]);
k:=k-lowbit(k);
end;
end; begin
assign(input,'bzoj3295.in'); reset(input);
assign(output,'bzoj3295.out'); rewrite(output);
readln(n,m); for i:= to n do
begin
read(a[i]);
b[a[i]]:=i;
a1[i]:=getsum(n)-getsum(a[i]);
ans:=ans+a1[i];
j:=a[i];
while j<=n do
begin
inc(c[j]);
j:=j+lowbit(j);
end;
end; fillchar(c,sizeof(c),);
for i:=n downto do
begin
a2[i]:=getsum(a[i]-);
j:=a[i];
while j<=n do
begin
inc(c[j]);
j:=j+lowbit(j);
end;
end; { for i:=1 to n do write(a1[i],' ');
writeln;
for i:=1 to n do write(a2[i],' '); }
for i:= to m do
begin
readln(x);
writeln(ans);
j:=b[x];
ans:=ans-(a1[j]+a2[j]-ask(,j-,x+,n)-ask(j+,n,,x-));
change(j,x,);
end; close(input);
close(output);
end.
【BZOJ3295】动态逆序对(BIT套动态加点线段树)的更多相关文章
- bzoj 3295 动态逆序对 (三维偏序,CDQ+树状数组)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3295 思路: 可以将这道题看成倒着插入,这样就可以转化成求逆序对数,用CDQ分治降维,正反用 ...
- BZOJ 3295:[Cqoi2011]动态逆序对(三维偏序 CDQ分治+树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:简单明了. 思路:终于好像有点明白CDQ分治处理三维偏序了.把删除操作看作是插入操作,那 ...
- 4163 hzwer与逆序对 (codevs + 权值线段树 + 求逆序对)
题目链接:http://codevs.cn/problem/4163/ 题目:
- bzoj3295 洛谷P3157、1393 动态逆序对——树套树
题目:bzoj3295 https://www.lydsy.com/JudgeOnline/problem.php?id=3295 洛谷 P3157(同一道题) https://www.luogu.o ...
- bzoj3295[Cqoi2011]动态逆序对 树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5987 Solved: 2080[Submit][Sta ...
- [BZOJ3295][Cqoi2011]动态逆序对 CDQ分治&树套树
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MB Description 对于序列A,它的逆序对数定义为满足i<j,且 ...
- BZOJ3295 动态逆序对(树状数组套线段树)
[Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6058 Solved: 2117[Submit][Status][D ...
- BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7465 Solved: 2662[Submit][Sta ...
- 【CQOI2011】动态逆序对 BZOJ3295
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
随机推荐
- re正则表达式讲解—初步认识
# f = open(r"C:\Users\LENOVO\Desktop\模特.txt",'r') # 1.常规提取文档内容方法 # contacts = [] # for i i ...
- poj1862 Stripies
思路: 简单贪心. 实现: #include <iostream> #include <cstdio> #include <algorithm> #include ...
- elasticsearch 2.4.0安装说明
首先从官网下载安装包,是个压缩文件,然后解压 在es目录下找到es的配置文件 修改集群(cluster)名称 PS:一般情况下一台机只部署一个es程序,也就是一个集群,默认集群名是ewater_mai ...
- 安装mysql时 make 时 提示 redeclaration of C++ built-in type ‘bool’ 错误
安装mysql时 make 时 提示 redeclaration of C++ built-in type ‘bool’ 错误 由于gcc-c++是在./configure后进行编译的 重新./con ...
- [Java 8] (9) Lambda表达式对递归的优化(下) - 使用备忘录模式(Memoization Pattern) .
使用备忘录模式(Memoization Pattern)提高性能 这个模式说白了,就是将需要进行大量计算的结果缓存起来,然后在下次需要的时候直接取得就好了.因此,底层只需要使用一个Map就够了. 但是 ...
- 深入解析Web Services
SOA,面向服务器建构,是一款架构,这几年虽然没前几年那么流行,但是还是有很多企业在用,而Web Services是目前适合做SOA的主要技术之一,通过使用Web Services,应用程序可以对外发 ...
- Android从图库选择照片
从机里取照片,开头用网上找的代码测试,导致类似下面这样的Crash:java.lang.RuntimeException: Failure delivering result java.lang.Se ...
- 关于在Qt里让程序休眠一段时间的方法总结
出处:http://hanzhaoxin.cnblogs.com/ Qt 为何没有提供 Sleep 论坛上不时见到有人问: Qt 为什么没有提供跨平台的 sleep 函数? 使用平台相关的 Sleep ...
- Perl monks 的 快速回复
on Jun 20, 2019 at 11:39 UTC ( #11101620=perlquestion: print w/replies, xml ) Need Help?? jimyokl ha ...
- 在window下搭建即时即用的hyperledger fabric 的环境
有版本号的严格按要求,遇到不少坑 1)安装git 版本无要求 2)安装go 1.9 配置环境变量 3)安装Vagrant 1.9.4 4)安装VirtualBox 5.1.28 5)在go ...