有几个点卡常数……

  发现若第一维为位置,第二维为大小,那么修改时第一维修改区间,查询时第一维查询区间,必须挂标记。而这种情况下标记很抽象,而且Push_down不是O(1)的,并不可行。
  那要怎么做呢?不妨交换一下,第一维为大小,第二维为位置,在第二维中挂标记,这样Push_down就是O(1)的了。
  做完这道题,我最大的启发就是:树套树不适于在第一维挂标记,因为标记的维度会是一维的,根本不好维护。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <ctime>
using namespace std;
const int maxn=;
const int maxm=;
int rt[maxn*],tot,n,m;
int ch[maxm][],sum[maxm],tag[maxm]; void Push_up(int x){
sum[x]=sum[ch[x][]]+sum[ch[x][]];
} void Add(int &x,int l,int r,int d){
if(!x)x=++tot;
sum[x]+=(r-l+)*d;
tag[x]+=d;
} void Push_down(int x,int l,int r){
if(tag[x]&&l!=r){
int mid=(l+r)>>;
if(!ch[x][])ch[x][]=++tot;
if(!ch[x][])ch[x][]=++tot;
sum[ch[x][]]+=(mid-l+)*tag[x];tag[ch[x][]]+=tag[x];
sum[ch[x][]]+=(r-mid)*tag[x];tag[ch[x][]]+=tag[x];
tag[x]=;
}
} void Update(int &x,int l,int r,int a,int b){
if(!x)x=++tot;
Push_down(x,l,r);
if(l>=a&&r<=b){sum[x]+=r-l+;tag[x]+=;return;}
int mid=(l+r)>>;
if(mid>=a)Update(ch[x][],l,mid,a,b);
if(mid<b)Update(ch[x][],mid+,r,a,b);
Push_up(x);
} void Modify(int x,int l,int r,int g,int a,int b){
Update(rt[x],,n,a,b);
if(l==r)return;
int mid=(l+r)>>;
if(mid>=g)Modify(x<<,l,mid,g,a,b);
else Modify(x<<|,mid+,r,g,a,b);
} int Query(int x,int l,int r,int a,int b){
if(!x)return ;
Push_down(x,l,r);
if(l>=a&&r<=b)return sum[x];
int mid=(l+r)>>,ret=;
if(mid>=a)ret=Query(ch[x][],l,mid,a,b);
if(mid<b)ret+=Query(ch[x][],mid+,r,a,b);
return ret;
} int Solve(int l,int r,int k){
int lo=,hi=n,p=;
while(lo<hi){
int mid=(lo+hi)>>,tmp;
tmp=Query(rt[p<<],,n,l,r);
if(tmp>=k)hi=mid,p<<=;
else lo=mid+,p=p<<|,k-=tmp;
}
return hi;
} int op,a,b,c;
int main(){
#ifndef ONLINE_JUDGE
freopen("zjoi13_sequence.in","r",stdin);
freopen("zjoi13_sequence.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d%d",&op,&a,&b,&c);
if(op==)Modify(,,n,n-c+,a,b);
else printf("%d\n",n-Solve(a,b,c)+);
}
//printf("%.2f\n",(double)clock()/CLOCKS_PER_SEC);
return ;
}

  然后就是喜闻乐见的整体二分,很好理解。

  有些地方没有缩行,打丑了,理论上60行足矣,这就是整体二分的威力!

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
struct Node{
int tp,l,r,k,id,tmp;
}p[maxn],tmp[maxn]; int b0[maxn],b1[maxn];
int v0[maxn],v1[maxn];
int ans[maxn],n,Q,tim,cntQ; void Add0(int x,int d){
while(x<=n){
b0[x]=v0[x]==tim?b0[x]+d:d;
v0[x]=tim;
x+=x&(-x);
}
} void Add1(int x,int d){
while(x<=n){
b1[x]=v1[x]==tim?b1[x]+d:d;
v1[x]=tim;
x+=x&(-x);
}
} void Update(int l,int r,int d){
Add0(l,d);
Add0(r+,-d);
Add1(l,-(l-)*d);
Add1(r+,r*d);
} int Query(int x){
int ret=;
for(int i=x;i;i-=i&(-i))
ret+=v0[i]==tim?b0[i]:;
ret*=x;
for(int i=x;i;i-=i&(-i))
ret+=v1[i]==tim?b1[i]:;
return ret;
} int Que(int l,int r){
return Query(r)-Query(l-);
} void Solve(int h,int t,int l,int r){
if(h>t)return;
if(l==r){
for(int i=h;i<=t;i++)
ans[p[i].id]=l;
return;
}
int mid=(l+r)>>;
int ct1=h,ct2=h;++tim;
for(int i=h;i<=t;i++){
if(p[i].tp==){
if(p[i].k>mid)continue;
Update(p[i].l,p[i].r,);
ct2+=;
}
else{
p[i].tmp=Que(p[i].l,p[i].r);
if(p[i].tmp>=p[i].k)ct2+=;
}
}
for(int i=h;i<=t;i++){
if(p[i].tp==){
if(p[i].k>mid)tmp[ct2++]=p[i];
else tmp[ct1++]=p[i];
}
else{
if(p[i].tmp>=p[i].k)tmp[ct1++]=p[i];
else p[i].k-=p[i].tmp,tmp[ct2++]=p[i];
}
}
for(int i=h;i<=t;i++)p[i]=tmp[i];
Solve(h,ct1-,l,mid);Solve(ct1,t,mid+,r);
} int main(){
#ifndef ONLINE_JUDGE
freopen("zjoi13_sequence.in","r",stdin);
freopen("zjoi13_sequence.out","w",stdout);
#endif
scanf("%d%d",&n,&Q);
for(int i=;i<=Q;i++){
scanf("%d%d",&p[i].tp,&p[i].l);
scanf("%d%d",&p[i].r,&p[i].k);
if(p[i].tp==){
p[i].id=++cntQ;
p[i].k=Que(p[i].l,p[i].r)-p[i].k+;
}
else
Update(p[i].l,p[i].r,);
} Solve(,Q,,n); for(int i=;i<=cntQ;i++)
printf("%d\n",ans[i]);
return ;
}

数据结构(树套树):ZJOI 2013 K大数查询的更多相关文章

  1. [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)

    [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...

  2. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  3. 解题:ZJOI 2013 K大数查询

    题面 树套树,权值线段树套序列线段树,每次在在权值线段树上的每棵子树上做区间加,查询的时候左右子树二分 本来想两个都动态开点的,这样能体现树套树在线的优越性.但是常数太大惹,所以外层直接固定建树了QA ...

  4. [ZJOI 2013] K大数查询

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3110 [算法] 整体二分 + 线段树 时间复杂度 : O(NlogN ^ 2) [代 ...

  5. [BZOJ 3110] [ZJOI 2013] K大数查询

    Description 有 \(N\) 个位置,\(M\) 个操作.操作有两种,每次操作如果是: 1 a b c:表示在第 \(a\) 个位置到第 \(b\) 个位置,每个位置加入一个数 \(c\): ...

  6. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

  7. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  8. ZJOI2013 K大数查询 和 LG3380【模板】二逼平衡树(树套树)

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

  9. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

随机推荐

  1. xcode 6.4模拟器出现多个相同版本:OSX Yosemite 上安装xcode7 beta和xcode6.4

    错误现象是:我在OSX Yosemite上同时安装了Xcode 7Beta和Xcode 6.4,然后Xcode 6.4的模拟器出现了重复版本.截图如下: 解决方法是: 删除该路径下的所有文件:~/Li ...

  2. 启动hadoop时候报错:localhost: ssh: Could not resolve hostname localhost: Temporary failure in name resolution”

    这个错误是由于配置文件没有配置好.解决方案如下: 1 打开profile文件 vim /etc/profile 2 在文件最后加入的内容应该如下(高亮的两句一般是大家缺少的): export JAVA ...

  3. Opencart 之 Registry 类详解

    Registry 中文意思是记录,登记,记录本的意思, 在opencart中他的用途就是 登记公共类.类的原型放在 system\engine文件夹下 代码很简单: <?php final cl ...

  4. Ubuntu系统配置日志/var/log/message

    ubuntu系统默认不生成/var/log/messages文件,有时候想查看相关日志就很不方便,于是我们可以设置使系统生成此文件. 1.先安装 apt-get install rsyslog2.用v ...

  5. 外部式css样式,写在单独的一个文件中

    外部式css样式(也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css”为扩展名,在<head>内(不是在<style>标签内)使用<l ...

  6. 转载-Linux下svn搭建配置流程

    Linux下svn搭建配置流程     一.    源文件编译安装.源文件共两个,为: 1.   下载subversion源文件 subversion-1.6.1.tar.gz http://d136 ...

  7. Oracle 面试宝典 - General Questions

    转自 http://www.orafaq.com/wiki/Interview_Questions Tell us about yourself/ your background. What are ...

  8. dede定义全局变量(include/common.inc.php)及调用方式

    dede定义全局变量的文件include/common.inc.php及使用   在include/common.inc.php文件里,dede定义了大量的全局变量,详细自己去看看   dede模板里 ...

  9. 知识备忘phpcms 简单解析一 数据表字段

    PHPCMS V9帮助中心 数据结构 phpcms v9 数据... phpcms v9 数据... PHPSSO 数据库结... phpcms v9 数据表结构 在线版 PHPCMS V9 数据结构 ...

  10. Trigger model Trigger expr_id in WorkFolow

    For example, suppose you want to set a Sale Order into the state "Done" once it has been s ...