//==========================

蒟蒻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大数查询 【树套树,标记永久化】相关推荐

  1. BZOJ3110: [Zjoi2013]K大数查询

    BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...

  2. bzoj3110 [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 10703  Solved: 3209 [Submit][ ...

  3. [BZOJ3110] [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 9208  Solved: 2737 [Submit][S ...

  4. BZOJ3110: [Zjoi2013]K大数查询(整体二分)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  5. bzoj 3110: [Zjoi2013]K大数查询(树套树)

    树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...

  6. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

  7. P3332 [ZJOI2013]K大数查询(整体二分做法)

    P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...

  8. 3110: [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...

  9. P3332 [ZJOI2013]K大数查询【整体二分】或【树套树】

    传送门 给定一个长度为NNN的可重集合 支持修改,离线 求区间可重集合的并集第K大 这里介绍两种方法[树套树]和 [整体二分] 这里还有个单点修改,有点类似的 P2617 Dynamic Rankin ...

最新文章

  1. 验证和训练loss和acc多种情况分析
  2. 腾讯十年老兵:区块链本质上是一个异地多活的分布式数据库
  3. @font-face 使用过程
  4. python只读模式可以打印嘛_只读python属性?无法打印对象
  5. 程序设计中的一些感悟
  6. java转型 内存_java 对象转型内存分析
  7. android数据绑定_Android数据绑定
  8. Python类常用的魔术方法
  9. linux远程升级运行程序,在LINUX上对DSP程序远程升级的实现想法
  10. 解决NLPIR汉语分词系统init failed问题
  11. 【樽海鞘算法】基于樽海鞘算法求解多目标问题附matlab代码
  12. H5微信分享、自定义微信分享
  13. 前端工程师薪资差距可达7.3倍!4月程序员薪资统计出炉,速看!
  14. 数学:确定性的丧失---第二章 数学真理的繁荣
  15. Windows开机加速实战之开机设置优…
  16. C语言中简单冒泡排序不花里胡哨
  17. 使用跨端解决方案Rax编写鸿蒙应用
  18. 北大计算机与微电子学校,中国计算机大会CNCC2019在苏州隆重举行
  19. java与设计模式-观察者模式
  20. 美团网手机客户端产品分析

热门文章

  1. 马化腾六年后知乎再提问:未来十年哪些基础科学突破会影响互联网科技产业?...
  2. 深度学习:技术原理、迭代路径与局限
  3. 深度 | 谷歌的新CNN特征可视化方法,构造出一个华丽繁复的新世界
  4. 他是世界上最杰出的程序员,一个月写了个操作系统,退休后去做飞行员!
  5. Cortana 的谢幕,不一定是产品问题
  6. Linux常用命令大全-toolfk程序员在线工具网
  7. 第一讲 IDLE使用
  8. 如何查看Linux内核是否为64位版本?
  9. 无线+传感技术将物联网推向云端
  10. golang learning