【题目】

Description

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

Input

第一行N,M
接下来M行,每行形如1 a b c或2 a b c

Output

输出每个询问的结果

Sample Input

2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3

Sample Output

1
2
1

HINT

【样例说明】

第一个操作 后位置 1 的数只有 1 , 位置 2 的数也只有 1 。 第二个操作 后位置 1

的数有 1 、 2 ,位置 2 的数也有 1 、 2 。 第三次询问 位置 1 到位置 1 第 2 大的数 是

1 。 第四次询问 位置 1 到位置 1 第 1 大的数是 2 。 第五次询问 位置 1 到位置 2 第 3

大的数是 1 。‍

N,M<=50000,N,M<=50000

a<=b<=N

1操作中abs(c)<=N

2操作中c<=Maxlongint

 
 
【分析】
  这个,区间修改,树套树感觉还是可以的,就是线段树套字母树?(大家写的都是套平衡树,我爱字母树),然后线段树上是区间修改,所以要打lazy标记。
  但是我不打树套树!!自从上次爆空间之后【TAT 可能大神要说套平衡树啊不会爆..【我平衡树垃圾。。。
  然后我试着用CDQ分治?【天哪怎么不行的说。。。。跟上一题怎么不一样TAT
  然后就去搜题解——整体二分。。。
  我觉得他跟CDQ分治还是很不一样的,CDQ分治是做[l,mid]对[mid+1,r]的答案,对什么三维偏序的独大,他是把时间维弄成一维,普通的单点修改题就可以看成n维偏序了。
  但是,这题是区间修改,【好像不行,反正我想了很久没想到ORZ..区间跨mid怎么破。。
  
  正题-。-
用solve(l,r,S)表示现在处理S集合,S集合是操作集合按照时间排序,所有插入操作满足插入的球数值在l~r,所有询问操作满足其答案在区间l~r。 
每个询问操作需要保存一个cnt代表目前在其询问的对应区间内>r的有多少个。 
然后我们按顺序扫描操作。先记mid=(l+r)/2 
对于插入操作,如果其插入的球数值>mid那么我们将对应区间加1(用线段树维护区间内mid+1~r的球个数)。然后根据其数值让其进入l~mid或mid+1~r。 
对于询问操作,我们得到其区间内数值为mid+1~r的个数j,然后如果j+cnt<=k-1那么显然mid不可能是该询问的答案,将该询问进入l~mid并更新其的cnt否则进入mid+1~r。 
然后做到l=r的时候就可以解决所有进入此区间的询问。 
 
 
  我觉得网上的题解都不怎么说人话的【我垃圾看了好久
  二分的是答案!!![l,mid][mid+1,r]是值来的,不是区间。
  如果你插入的数<mid,那就分在做区间,否则是右区间。
  然后,对于询问,他答案是多少,就分到那个区间【QQQ:鬼知道他答案多少a..知道答案是多少还用你算。。。
  【AAA:Hhh,但你可以知道他是否大于mid啊,你把插入的数>=mid的操作做一下,就是标记那个区间加了一个大于mid的数,(树状数组维护),然后看看你的询问区间里面标记了多少个数大于mid了,如果有很多,那么就是右区间,如果不足够你询问的排名,就是左区间
  【%&&%:哇好神奇!!!
  注意哦,如果询问被分到了左区间,要剪掉答案在右区间的影响哦【虽然你的答案不在右区间,但是他们占排名,所以询问的排名要减掉他。。
  【代码实现还是很神奇的啊【我还看了别人代码才打的。
  看discuss说会爆int,要用unsigned int 我WA了很久,一生气,全LL就A了、.
  其实题目说有负数,但是我知道数据没有,就偷懒没写啦Hhh
 
垃圾代码:
 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define INF 0xfffffff
#define Maxn 50010
#define LL long long struct work
{
LL l,r,c,p,ans;
}t[Maxn]; LL a[Maxn],a1[Maxn],a2[Maxn],ans[Maxn];
LL n,m; LL c1[Maxn],c2[Maxn];
void add(LL l,LL r,LL c)
{
// printf("add %d %d %d\n",l,r,c);
for(LL i=l;i<=n;i+=i&(-i))
c1[i]+=c,c2[i]+=l*c;
r++;
for(LL i=r;i<=n;i+=i&(-i))
c1[i]-=c,c2[i]-=r*c;
} LL query(LL l,LL r)
{
// printf("ask %d %d ",l,r);
LL ans=;
for(LL i=r;i>=;i-=i&(-i))
ans+=c1[i]*(r+)-c2[i];
l--;
for(LL i=l;i>=;i-=i&(-i))
ans-=c1[i]*(l+)-c2[i];
// printf("%d\n",ans);
return ans;
} void solve(LL x,LL y,LL l,LL r)
{
if(l==r)
{
for(LL i=x;i<=y;i++) if(t[a[i]].p==) t[a[i]].ans=l;
return;
}
LL mid=(l+r)>>;
a1[]=;a2[]=;
for(LL i=x;i<=y;i++)
{
if(t[a[i]].p==)
{
if(t[a[i]].c<=mid) a1[++a1[]]=a[i];
else a2[++a2[]]=a[i],add(t[a[i]].l,t[a[i]].r,);
}
else
{
LL now=query(t[a[i]].l,t[a[i]].r);
if(now>=t[a[i]].c) a2[++a2[]]=a[i];
else a1[++a1[]]=a[i],t[a[i]].c-=now;
}
}
for(LL i=x;i<=y;i++) if(t[a[i]].p==&&t[a[i]].c>mid) add(t[a[i]].l,t[a[i]].r,-);
LL ll=a1[],rr=a2[];
for(LL i=;i<=ll;i++) a[x+i-]=a1[i];
for(LL i=;i<=rr;i++) a[x+ll+i-]=a2[i];
solve(x,x+ll-,l,mid);
solve(x+ll,x+ll+rr-,mid+,r);
} void init()
{
scanf("%lld%lld",&n,&m);
for(LL i=;i<=m;i++)
{
scanf("%lld%lld%lld%lld",&t[i].p,&t[i].l,&t[i].r,&t[i].c);
}
memset(c1,,sizeof(c1));
memset(c2,,sizeof(c2));
for(LL i=;i<=m;i++) a[i]=i;
solve(,m,,n);
} int main()
{
init();
for(LL i=;i<=m;i++) if(t[i].p==) printf("%lld\n",t[i].ans);
return ;
}

2016-11-09 13:46:58

【BZOJ 3110】 [Zjoi2013]K大数查询(整体二分)的更多相关文章

  1. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  2. BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]

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

  3. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  4. BZOJ 3110 [ZJOI2013]K大数查询 (整体二分+线段树)

    和dynamic rankings这道题的思想一样 只不过是把树状数组换成线段树区间修改,求第$K$大的而不是第$K$小的 这道题还有负数,需要离散 #include <vector> # ...

  5. BZOJ 3110 [Zjoi2013]K大数查询(整体二分)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 11654  Solved: 3505[Submit][St ...

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

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

  7. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

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

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

  9. BZOJ 3110: [Zjoi2013]K大数查询( 树状数组套主席树 )

    BIT+(可持久化)权值线段树, 用到了BIT的差分技巧. 时间复杂度O(Nlog^2(N)) ---------------------------------------------------- ...

  10. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

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

随机推荐

  1. linux x64下编译libjpeg,libpng,zlib

    libJpeg编译: 下载libjpeg源码:http://www.ijg.org/,下载jpegsrc.v9a.tar.gz 解压源码,命令:tar -zxvf jpegsrc.v9a,源码文件夹为 ...

  2. spring mvc源码解析

    1.从DispatcherServlet开始 与很多使用广泛的MVC框架一样,SpringMVC使用的是FrontController模式,所有的设计都围绕DispatcherServlet 为中心来 ...

  3. IOS_OC_百度地图与社交分享

    前奏. 知识点介绍 一. 导航和画线 地图画线 (理解) 二. 百度地图 集成百度地图 (掌握) POI检索 (掌握) 三. 社交分享 系统自带分享 (了解) 友盟分享 (掌握) SSO授权 (理解) ...

  4. c#汉字与编码之间的转换(输出十六进制)

    /******************************************************************/ /*********************** ****** ...

  5. MyEclipse 多项目对应配置多个Tomcat

    在MyEclipse的安装目录下,有D:\Program Files\MyEclipse 6.5\myeclipse\eclipse\plugins 的插件路径. 里边很多插件的配置文件包.   找到 ...

  6. (LightOJ 1004) Monkey Banana Problem 简单dp

    You are in the world of mathematics to solve the great "Monkey Banana Problem". It states ...

  7. 使用 Virtual Box 安装 android x86

    1.安装 跟随别人的教程:http://www.maketecheasier.com/run-android-4-3-in-virtualbox/ 2.问题 安装过程出现以下问题:Kernel pan ...

  8. 线段树(单点更新)HDU1166、HDU1742

    在上一篇博文里面,我提到了我不会线段树,现在就努力地学习啊! 今天AC一题感觉都很累,可能是状态不佳,在做HDU1166这题目时候,RE了无数次. 原因是:我的宏定义写错了,我已经不是第一犯这种错误了 ...

  9. MySQL存储引擎,优化,事务

    1唯一约束unique和主键key的区别?     1.什么是数据的存储引擎?       存储引擎就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数 ...

  10. ubuntu 安装flash插件

    参考文献: http://wiki.debian.org.hk/w/Install_Flash_Player_with_APTapt-get install adobe-flashplugin