bzoj3295
没什么好说的,树套树应该随便搞
我在128MB空间下大胆的写了主席树
当然要把原树和修改树分开来建
没有然后了
type node=record
l,r,s:longint;
end; var tree:array[..] of node;
c:array[..] of int64;
h,ph,a,b,d1,d2:array[..] of longint;
dd1,dd2:array[..,..] of longint;
d,t1,t2,i,x,y,n,m,t:longint;
ans:int64; function lowbit(x:longint):longint;
begin
exit(x and (-x));
end; procedure add(x:longint);
begin
while x<=n do
begin
c[x]:=c[x]+;
x:=x+lowbit(x);
end;
end; function get(x:longint):int64;
begin
get:=;
while x> do
begin
get:=get+c[x];
x:=x-lowbit(x);
end;
end; procedure update(i:longint);
begin
tree[i].s:=tree[tree[i].l].s+tree[tree[i].r].s;
end; function build(l,r:longint):longint;
var m,q:longint;
begin
inc(t);
if l=r then
exit(t)
else begin
m:=(l+r) shr ;
q:=t;
tree[q].l:=build(l,m);
tree[q].r:=build(m+,r);
exit(q);
end;
end; function insert(l,r,last,x,y:longint):longint;
var m,q:longint;
begin
inc(t);
if l=r then
begin
tree[t].s:=tree[last].s+y;
exit(t);
end
else begin
m:=(l+r) shr ;
q:=t;
if x<=m then
begin
tree[q].r:=tree[last].r;
last:=tree[last].l;
tree[q].l:=insert(l,m,last,x,y);
end
else begin
tree[q].l:=tree[last].l;
last:=tree[last].r;
tree[q].r:=insert(m+,r,last,x,y);
end;
update(q);
exit(q);
end;
end; function getans(l,r,x,y:longint):longint;
var m,s,i:longint;
begin
if (x<=l) and (y>=r) then
begin
s:=;
for i:= to t2 do
s:=s+tree[d2[i]].s;
for i:= to t1 do
s:=s-tree[d1[i]].s;
exit(s);
end
else begin
m:=(l+r) shr ;
s:=;
if (x<=m) then
begin
inc(d);
for i:= to t1 do
begin
dd1[d,i]:=d1[i];
d1[i]:=tree[d1[i]].l;
end;
for i:= to t2 do
begin
dd2[d,i]:=d2[i];
d2[i]:=tree[d2[i]].l;
end;
s:=s+getans(l,m,x,y);
for i:= to t1 do
d1[i]:=dd1[d,i];
for i:= to t2 do
d2[i]:=dd2[d,i];
dec(d);
end;
if y>m then
begin
for i:= to t1 do
d1[i]:=tree[d1[i]].r;
for i:= to t2 do
d2[i]:=tree[d2[i]].r;
s:=s+getans(m+,r,x,y);
end;
exit(s);
end;
end; function ask(l,r,x,y:longint):longint;
var i:longint;
begin
if r= then exit();
if l=n+ then exit();
if x=n+ then exit();
if y= then exit();
dec(l);
t1:=;
t2:=;
d1[]:=ph[l];
d2[]:=ph[r];
i:=l;
while i> do
begin
if h[i]<> then
begin
inc(t1);
d1[t1]:=h[i];
end;
i:=i-lowbit(i);
end;
i:=r;
while i> do
begin
if h[i]<> then
begin
inc(t2);
d2[t2]:=h[i];
end;
i:=i-lowbit(i);
end;
d:=;
exit(getans(,n,x,y));
end; procedure del(x,y:longint);
begin
while x<=n do
begin
h[x]:=insert(,n,h[x],y,-);
x:=x+lowbit(x);
end;
end; begin
readln(n,m);
for i:= to n do
begin
readln(a[i]);
b[a[i]]:=i;
end;
for i:=n downto do
begin
ans:=ans+get(a[i]-);
add(a[i]);
end;
h[]:=build(,n);
ph[]:=h[];
for i:= to n do
ph[i]:=insert(,n,ph[i-],a[i],);
for i:= to m do
begin
readln(x);
y:=b[x];
writeln(ans);
ans:=ans-ask(,y-,x+,n)-ask(y+,n,,x-);
del(y,x);
end;
end.
bzoj3295的更多相关文章
- 【CQOI2011】动态逆序对 BZOJ3295
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- 【bzoj3295】 Cqoi2011—动态逆序对
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 (题目链接) 题意 给出某种排列,按照某种顺序依次删除m个数,在每次删除一个数前统计序列中逆序 ...
- 【BZOJ3295】动态逆序对(线段树,树状数组)
[BZOJ3295]动态逆序对(线段树,树状数组) 题面 Description 对于序列A,它的逆序对数定义为满足iAj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的 ...
- BZOJ3295 [Cqoi2011]动态逆序对 分治 树状数组
原文链接http://www.cnblogs.com/zhouzhendong/p/8678185.html 题目传送门 - BZOJ3295 题意 对于序列$A$,它的逆序对数定义为满足$i< ...
- 【bzoj3295】动态逆序对
Portal --> bzoj3295 Solution 虽然说这个可能原本是一道愉快的树套树但是 没有强制在线并且是三维限制那就大力cdq分治啊! 看到"按照某个顺序依次删除 ...
- 【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
[BZOJ3295][Cqoi2011]动态逆序对 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依 ...
- BZOJ3295动态逆序对
一道比较傻的CDQ分治 CDQ: 主要用于解决三位偏序的问题 #include<cstdio> #include<cctype> #include<algorithm&g ...
- 【BZOJ3295】动态逆序对(BIT套动态加点线段树)
题意:对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. 给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对 ...
- bzoj3295 [Cqoi2011]动态逆序对 cdq+树状数组
[bzoj3295][Cqoi2011]动态逆序对 2014年6月17日4,7954 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数. ...
- bzoj3295 洛谷P3157、1393 动态逆序对——树套树
题目:bzoj3295 https://www.lydsy.com/JudgeOnline/problem.php?id=3295 洛谷 P3157(同一道题) https://www.luogu.o ...
随机推荐
- Java基础知识强化之集合框架笔记39:Set集合之HashSet存储字符串并遍历
1. HashSet类的概述: (1)不保证set的迭代顺序 (2)特别是它不保证该顺序恒久不变 HashSet底层数据结构是哈希表,哈希表依赖于哈希值存储,通过哈希值来确定元素的位置, 而保证元素 ...
- Using GUID to generate the unique file name in C#
GUID, the abbreviation of "Global Unique Identifier", is a unique reference number used as ...
- 在Xcode4中给程序提供命令行参数(转)
网上xcode4的资料实在是不多,再加上xcode4相对3的改动还那么大,并且还只有英文版.我为了这个问题头痛了很久.后来终于找到了...方法如下 xcode菜单的Product->EditSc ...
- 【HOJ1356】【Miller_rabin素性测试】Prime Judge
Given a positive integer, your job is writing a program to determine whether it is a prime number or ...
- 用eval 动态编译代码
eval 有另外一种用法, 其参数是作为一个字串表达式, 而不是代码块.在运行时, 它将字串临时编译成代码并且执行. 这很易用, 但也很危险, 因为有可能会把具有危害性的代码放到字串里. foreac ...
- 解决 dyld: Library not loaded:Reason: image not found
在使用第三方framework时,直接把framework拖到项目中,运行时报错: dyld: Library not loaded: @rpath/ZipZap.framework/ZipZap R ...
- Linux ./configure && make && make install 编译安装和卸载
正常的编译安装/卸载: 源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install). configure文件是一个可执行的脚本文件,它有很多选项, ...
- QTP插入Output Value和插入CheckPoint,注意点
1. 必须打开程序才能进行Output value和CheckPoint的插入. 2. 也有可能是对象获取不到,从新加载对象库. 提示如下图:
- delphi定义自己的消息
定义一个消息需要两个步骤: 1.声明一个消息标识符 2.声明一个消息记录类型 一个消息标识符是一个整数大小的常数.Windows自用低于1024的消息,所以当你声明你自己的消息,你应该开始高于这一数字 ...
- Day10 网络编程(续)
作用域 Python的作用域是函数,没有块级作用域 if 1 == 1: name = 'wang' print(name) #wang for i in range(10): name = i ...