bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】
//==========================
蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/ 转载要声明!
//==========================
好久没写题解了。
但是这题太神了然后做法太神了于是写一下。
这题做法很多,比如黄学长hzw的权值线段树套线段树,比如学长云的bit套主席树(其实是写法更神然后我不会用)。
然后看到hzhwcmhf大神题解。
http://tieba.baidu.com/p/2246783535
震惊了。
好了开说说做法。建一颗朴素的线段树,树的每个点表示每个区间,然后每个区间建两棵树,一棵是mark树,一棵是all树,两棵都是权值线段树。
“mark表示该区间每个点上都会加上mark线段树里的元素
all表示该区间所有点的元素集合”
这道题麻烦的地方就在与标记,如果标记要下传的话,那么每次可能要下传很多个点。
于是标记永久化,就是不要下传。
对于修改:如果修改区间是当前点区间,那么就加入mark中。如果不是,那么就加入all。操作都是单点修改。加入mark时为c+1,加入all是为c+len
对于询问:首先包含在查询区间内的区间的所有的all,然后mark要去掉没有重合在一起的地方,乘回差值。
(太久没写题解都不知道怎么说了)
速度还是挺快的
typearr=recordall,mark:longint;end; constmaxn=10000000; vartree:array[0..maxn]of arr;size,lson,rson,root1,root2:array[0..maxn]of longint;tot,sum,n,m,i,j,k,l:longint;function add:longint; begininc(tot);exit(tot); end;procedure sinsert(var x:longint;y,z:longint); varleft,right,mid,old:longint; beginif x=0 then x:=add;old:=x;left:=1;right:=n;while left<=right do beginmid:=(left+right)>>1;inc(size[x],z);if left=right then break;if y<=mid then beginright:=mid;if lson[x]=0 then lson[x]:=add;x:=lson[x];endelse beginleft:=mid+1;if rson[x]=0 then rson[x]:=add;x:=rson[x];end;end;x:=old; end;procedure binsert(x,l,r,tl,tr,tc:longint); varmid:longint; beginif (tl=l) and (tr=r) then beginsinsert(tree[x].mark,tc,1);exit;end;mid:=(l+r)>>1;sinsert(tree[x].all,tc,tr-tl+1);if tl>mid then binsert(x<<1+1,mid+1,r,tl,tr,tc)elseif tr<=mid then binsert(x<<1,l,mid,tl,tr,tc)else beginbinsert(x<<1,l,mid,tl,mid,tc);binsert(x<<1+1,mid+1,r,mid+1,tr,tc);end; end;procedure before(x,l,r,tl,tr:longint); varmid:longint; begininc(sum);root1[sum]:=tree[x].mark;root2[sum]:=tr-tl+1;if (tl=l) and (tr=r) then begininc(sum);root1[sum]:=tree[x].all;root2[sum]:=1;exit;end;mid:=(l+r)>>1;if tl>mid then before(x<<1+1,mid+1,r,tl,tr)elseif tr<=mid then before(x<<1,l,mid,tl,tr)else beginbefore(x<<1,l,mid,tl,mid);before(x<<1+1,mid+1,r,mid+1,tr);end; end;procedure query(x,y,z:longint); varleft,right,now,mid:longint; beginsum:=0;before(1,1,n,x,y);left:=1;right:=n;while left<right do beginnow:=0;mid:=(left+right)>>1;for i:=1 to sum donow:=size[rson[root1[i]]]*root2[i]+now;if now<z then begindec(z,now);right:=mid;for i:=1 to sum doroot1[i]:=lson[root1[i]];endelse beginleft:=mid+1;for i:=1 to sum doroot1[i]:=rson[root1[i]];end;end;writeln(left); end;beginreadln(n,m);while m>0 do begindec(m);readln(i,j,k,l);if i=1 then binsert(1,1,n,j,k,l)else query(j,k,l);end;readln;readln; end.
View Code
数组开小竟然wa了两次。
转载于:https://www.cnblogs.com/Macaulish/p/4385489.html
bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】相关推荐
- BZOJ3110: [Zjoi2013]K大数查询
BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...
- bzoj3110 [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 10703 Solved: 3209 [Submit][ ...
- [BZOJ3110] [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 9208 Solved: 2737 [Submit][S ...
- BZOJ3110: [Zjoi2013]K大数查询(整体二分)
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- bzoj 3110: [Zjoi2013]K大数查询(树套树)
树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...
- 洛谷 P3332 [ZJOI2013]K大数查询 解题报告
P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...
- P3332 [ZJOI2013]K大数查询(整体二分做法)
P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...
- 3110: [Zjoi2013]K大数查询
3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...
- P3332 [ZJOI2013]K大数查询【整体二分】或【树套树】
传送门 给定一个长度为NNN的可重集合 支持修改,离线 求区间可重集合的并集第K大 这里介绍两种方法[树套树]和 [整体二分] 这里还有个单点修改,有点类似的 P2617 Dynamic Rankin ...
最新文章
- 验证和训练loss和acc多种情况分析
- 腾讯十年老兵:区块链本质上是一个异地多活的分布式数据库
- @font-face 使用过程
- python只读模式可以打印嘛_只读python属性?无法打印对象
- 程序设计中的一些感悟
- java转型 内存_java 对象转型内存分析
- android数据绑定_Android数据绑定
- Python类常用的魔术方法
- linux远程升级运行程序,在LINUX上对DSP程序远程升级的实现想法
- 解决NLPIR汉语分词系统init failed问题
- 【樽海鞘算法】基于樽海鞘算法求解多目标问题附matlab代码
- H5微信分享、自定义微信分享
- 前端工程师薪资差距可达7.3倍!4月程序员薪资统计出炉,速看!
- 数学:确定性的丧失---第二章 数学真理的繁荣
- Windows开机加速实战之开机设置优…
- C语言中简单冒泡排序不花里胡哨
- 使用跨端解决方案Rax编写鸿蒙应用
- 北大计算机与微电子学校,中国计算机大会CNCC2019在苏州隆重举行
- java与设计模式-观察者模式
- 美团网手机客户端产品分析