BZOJ 3110 ZJOI2013 K大数查询 树套树

来源:互联网 发布:东莞淘宝美工培训班 编辑:程序博客网 时间:2024/05/17 02:15

题目大意:

有n个位置,m个操作,提供下列两种操作:

1.在[x,y]区间内每个位置插入一个z

2.查询[x,y]区间内的第k大

注意是第k大不是第k小

来一段《树套树之歌》吧:

树套树 树套树 树套树套树 树套树树套树套树 树套树套树套树套树 树套树树套树套树 树套树套树套树套树套树

BGM:《邮递马车》

树套树摆在这里 关键是怎么套 我一开始想的是权值线段树在内层 结果外层的话树状数区间修改+查询忘记怎么写了 线段树压根不会可持久化标记 最后只能权值线段树开在外面

权值线段树开在外面 内层是区间线段树 记录该权值的覆盖区域

蒟蒻伤不起啊。。。。

注意这道题的内存空间很不充裕 所以节点能不开就不开 省掉内存就是胜利

把y写成r WA了一下午。。。。。 40%达成 我看来是写不完十道题了。。。。

写完之后无论时间还是空间都和Rank上的神犇们差很远 看来我还是去学线段树可持久化标记吧。。。

此外这题虽然说abs(c)<=n 但是c都是正整数 不用担心了

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int n,m;struct Tree{Tree *ls,*rs;unsigned int num,mark;Tree(){ls=rs=0x0;num=mark=0;}void add(int x,int y,unsigned int z){num+=(y-x+1)*z;mark+=z;}void update(int x,int y,int l,int r){int mid=x+y>>1;if(x==l&&y==r){add(x,y,1u);return ;}if(!ls)ls=new Tree;if(!rs)rs=new Tree;if(mark){ls->add(x,mid,mark);rs->add(mid+1,y,mark);mark=0;}if(r<=mid) ls->update(x,mid,l,r);else if(l>mid) rs->update(mid+1,y,l,r);else ls->update(x,mid,l,mid),rs->update(mid+1,y,mid+1,r);num=ls->num+rs->num;}unsigned int getans(int x,int y,int l,int r){int mid=x+y>>1;if(!num)return 0;if(x==l&&y==r)return num;if(!ls)ls=new Tree;if(!rs)rs=new Tree;if(mark){ls->add(x,mid,mark);rs->add(mid+1,y,mark);mark=0;}if(r<=mid) return ls->getans(x,mid,l,r);if(l>mid) return rs->getans(mid+1,y,l,r);return ls->getans(x,mid,l,mid) + rs->getans(mid+1,y,mid+1,r);}};struct abcd{abcd *ls,*rs,;Tree *tree;abcd(){ls=rs=0x0;tree=new Tree;}void update(int x,int y,int l,int r,int val){int mid=x+y>>1;tree->update(1,n,l,r);if(x==y)return ;if(!ls)ls=new abcd;if(!rs)rs=new abcd;if(val<=mid)ls->update(x,mid,l,r,val);elsers->update(mid+1,y,l,r,val);}int getans(int x,int y,int l,int r,int k){int mid=x+y>>1;if(x==y)return mid;if(!ls)ls=new abcd;if(!rs)rs=new abcd;int r_sum=rs->tree->getans(1,n,l,r);if(k>r_sum)return ls->getans(x,mid,l,r,k-r_sum);elsereturn rs->getans(mid+1,y,l,r,k);}}root;int main(){//freopen("sequence.in","r",stdin);//freopen("sequence.out","w",stdout);int i,p,x,y,z;cin>>n>>m;for(i=1;i<=m;i++){scanf("%d%d%d%d",&p,&x,&y,&z);if(p==1)root.update(1,n,x,y,z);elseprintf("%d\n", root.getans(1,n,x,y,z) );}}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 初中生脸上长斑怎么办 初中生脸上长痘怎么办 初中成绩不好高中怎么办 农村老人去城里怎么办 留守儿童想妈妈怎么办 教师档案丢失了怎么办 转正定级表丢失怎么办 娃娃写作业慢怎么办 写作业眼睛疼怎么办 发生火灾怎么办大班教案 大班健康发生火灾怎么办 学生上课不提问怎么办 入户通知单丢了怎么办 打架后还来找事该怎么办 着火了怎么办教案视频 电脑一小半黑屏怎么办 绝地求生闪退怎么办 win7没浏览器了怎么办 浏览器被删除了怎么办 把快捷方式删了怎么办 ie文件找不到了怎么办 ie文件不存在了怎么办 大学素质分不够怎么办 素拓学分不够怎么办 大学毕业之前素拓分拿不满怎么办 武汉幼儿医保卡怎么办 养老院护工欺老人怎么办 皮肤毛孔粗大有痘印痘坑怎么办 额头上毛孔大怎么办 额头皮肤毛孔大怎么办 脸部粗糙毛孔大怎么办 脸上有痘印毛孔粗大怎么办 毛孔粗大痘印怎么办 教官12123一直加载怎么办 教官嗓子哑了怎么办 喜欢上考场教官怎么办 跟教官打起来怎么办 车险贴丢了怎么办 大学不想军训该怎么办 职高军训不想去怎么办 上大学不想军训怎么办