bzoj 3295 树套树
比较裸,可以有好多的优化,比如根本没有删除的点没有加在树套树中的必要,预处理
出来每个不会被删除的值可以减少不少时间,也可以写成树状数组套平衡树,都会快很多
/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/
//By BLADEVIL
type
rec =record
left, right, root :longint;
end;
var
n, m :longint;
high, cur :array[..] of longint;
t :array[..] of rec;
b_left, b_right, b_key :array[..] of longint;
b_size :array[..] of longint;
tot :longint;
ans :int64;
procedure swap(var a,b:longint);
var
c :longint;
begin
c:=a; a:=b; b:=c;
end;
procedure insert(var t:longint;v:longint);
begin
if t= then
begin
inc(tot);
t:=tot;
b_size[t]:=;
b_left[t]:=;
b_right[t]:=;
b_key[t]:=v;
end else
begin
inc(b_size[t]);
if v<b_key[t] then insert(b_left[t],v) else insert(b_right[t],v);
end;
end;
function b_delete(var t:longint;v:longint):longint;
begin
dec(b_size[t]);
if (b_key[t]=v) or (v>b_key[t]) and (b_right[t]=) or (v<b_key[t]) and (b_left[t]=) then
begin
b_delete:=b_key[t];
if (b_left[t]=) or (b_right[t]=) then t:=b_left[t]+b_right[t] else
b_key[t]:=b_delete(b_left[t],v+);
end else
if v>=b_key[t] then exit(b_delete(b_right[t],v)) else exit(b_delete(b_left[t],v));
end;
procedure build(x,l,r:longint);
var
mid :longint;
i :longint;
begin
t[x].left:=l; t[x].right:=r; t[x].root:=;
for i:=l to r do insert(t[x].root,high[i]);
if l=r then exit;
with t[x] do mid:=(left+right) div ;
build(*x,l,mid);
build(*x+,mid+,r);
end;
function b_less(var t:longint;v:longint):longint;
begin
if t= then exit();
if b_key[t]>=v then exit(b_less(b_left[t],v)) else
exit(b_size[b_left[t]]++b_less(b_right[t],v));
end;
function less(x,l,r,v:longint):longint;
var
mid :longint;
begin
if (t[x].left=l) and (t[x].right=r) then
exit(b_less(t[x].root,v));
with t[x] do mid:=(left+right) div ;
if mid<l then exit(less(*x+,l,r,v)) else
if mid>=r then exit(less(*x,l,r,v)) else
exit(less(*x,l,mid,v)+less(*x+,mid+,r,v));
end;
function b_greater(var t:longint; v:longint):longint;
begin
if t= then exit();
if b_key[t]<=v then exit(b_greater(b_right[t],v)) else
exit(b_size[b_right[t]]++b_greater(b_left[t],v));
end;
function greater(x,l,r,v:longint):longint;
var
mid :longint;
begin
if (t[x].left=l) and (t[x].right=r) then
exit(b_greater(t[x].root,v));
with t[x] do mid:=(left+right) div ;
if mid<l then exit(greater(*x+,l,r,v)) else
if mid>=r then exit(greater(*x,l,r,v)) else
exit(greater(*x,l,mid,v)+greater(*x+,mid+,r,v));
end;
procedure change(x,y,v:longint);
var
mid :longint;
begin
insert(t[x].root,v);
if (t[x].left=t[x].right) then exit;
with t[x] do mid:=(left+right) div ;
if mid<y then change(*x+,y,v) else change(*x,y,v);
end;
procedure delete(x,y,v:longint);
var
mid :longint;
begin
b_delete(t[x].root,v);
if (t[x].left=t[x].right) then exit;
with t[x] do mid:=(left+right) div ;
if mid<y then delete(*x+,y,v) else delete(*x,y,v);
end;
procedure init;
var
i :longint;
begin
read(n,m);
for i:= to n do read(high[i]);
for i:= to n do cur[high[i]]:=i;
build(,,n);
end;
procedure main;
var
i :longint;
x, y :longint;
begin
for i:= to n- do
ans:=ans+less(,i+,n,high[i]);
for i:= to m do
begin
writeln(ans);
read(x);
y:=cur[x];
delete(,y,x);
if y<> then ans:=ans-greater(,,y-,x);
if y<>n then ans:=ans-less(,y+,n,x);
end;
end;
begin
init;
main;
end.
bzoj 3295 树套树的更多相关文章
- 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)
[题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...
- bzoj 3295: [Cqoi2011]动态逆序对(树套树 or CDQ分治)
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- [BZOJ 3489] A simple rmq problem 【可持久化树套树】
题目链接:BZOJ - 3489 题目分析 “因为是OJ上的题,就简单点好了.”——出题人 真的..好..简单... 首先,我们求出每个数的前一个与它相同的数的位置,即 prev[i] ,如果前面没有 ...
- bzoj 1901: Zju2112 Dynamic Rankings(树套树)
1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- BZOJ 3110 k大数查询 & 树套树
题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...
- BZOJ 3110 树套树 && 永久化标记
感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...
- 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 978 Solved: 476 Descri ...
- BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)
题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...
随机推荐
- IOS学习4
---恢复内容开始--- UIScrollView 屏幕展示有限,超出一个屏时用户可滚动查看过多部分.UIView不具备滚动功能. -取消autolayout -设置CGSize contentSiz ...
- psd图片到html
正确的做法是:拿到psd后,先不要做别的,直接在文本编辑器中将网页的框架写出来,不要假设这块将来css要去怎么渲染,完全自然化的标签,不加任何的css.写完之后在各个浏览器运行之后确保大体定位都没有问 ...
- Python脚本控制的WebDriver 常用操作 <十一> 操作测试对象
下面将使用WebDriver来模拟键盘的输入操作,以及复习上节的层对象操作 测试用例场景 定位到具体的对象后,我们就可以对这个对象进行具体的操作,比如先前已经看到过的点击操作(click).一般来说, ...
- PAT乙级真题1001. 害死人不偿命的(3n+1)猜想 (15)(解题)
卡拉兹(Callatz)猜想: 对任何一个自然数n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把(3n+1)砍掉一半.这样一直反复砍下去,最后一定在某一步得到n=1.卡拉兹在1950年的世界数 ...
- 创建自己的oracle解释计划
1.解释计划 当使用explain plan来为一个查询生成预期的执行计划时,输出将包括一下几种: SQL访问的每一张表: 访问每张表的方法: 每一个需要联结的数据源所使用的联结方法: 按次序列出的所 ...
- ZygoteInit 相关分析
上一篇文章我们已经分析到调用com.android.internal.os.ZygoteInit类的main函数. 今天分析一下com.android.internal.os.ZygoteInit类的 ...
- 【javascript】html5中使用canvas编写头像上传截取功能
[javascript]html5中使用canvas编写头像上传截取功能 本人对canvas很是喜欢,于是想仿照新浪微博头像上传功能(前端使用canvas) 本程序目前在谷歌浏览器和火狐浏览器测试可用 ...
- Android保存图片到系统图库
最近有些用户反映保存图片之后在系统图库找不到保存的图片,遂决定彻底查看并解决下. Adnroid中保存图片的方法可能有如下两种: 第一种是自己写方法,如下代码: public static File ...
- 配置 apt-get cloudera 离线source(Cloudera Manager的源)
配置 apt-get cloudera 离线source(Cloudera Manager的源) 创建/etc/apt/source.list.d/cloudera-manager.list文件,并在 ...
- Eclipse基金会
昨天Eclipse基金会庆祝其成立十周年.2004年2月的新闻稿宣布该非盈利组织的正式成立,由包括开发者.消费者和插件提供商在内的各独立团体组成的董事会,为Eclipse的长期发展负责. 基金会成立时 ...