3110: [Zjoi2013]K大数查询

Time Limit: 20 Sec   Memory Limit: 512 MB

Submit: 418  
Solved: 235

[
Submit][
Status][
Discuss]

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

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

a<=b<=N

1操作中abs(c)<=N

2操作中abs(c)<=Maxlongint

Source

 

[
Submit][
Status][
Discuss]

本来上一次就偷懒。。。、

话说写线段树不写离散化可不是一个好习惯。。。

所以我果断加上了离散。。。

================Cute 分割线 ============================

其实这题可以直接拆数,zkw线段树区间修改法解决数组修改。。。

但是做到一半就把自己绕晕了....我X注定NC

话说这题要离散的是插入的数——所以拆的于是插入的数(具体来说,S1:头尾插1个,S2:头尾差x*i个)

然后总算A了……

我的人生都浪费在DeBug上了么......

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
#include<map>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define MAXN (50000+10)
#define MAXM (50000+10)
#define MINAi (1)
#define MAXAi (size)
#define maxlongint (2147483647)
int n,m;
int a2[MAXN],size=0;
struct node
{
int ch[2],c;
node():c(0){ch[0]=ch[1]=0;}
}q[10000000];
int root[MAXN<<1],tail=0;
void inc(int &x,long long l,long long r,int c,int d)
{
if (!x) x=++tail;
q[x].c+=d;
if (l==r) return;
long long m=l+r>>1;
if (c<=m) inc(q[x].ch[0],l,m,c,d);
else inc(q[x].ch[1],m+1,r,c,d);
}
void update(int x,int c,int d)
{
for(int i=x;i<=n;i+=i&(-i)) inc(root[i],MINAi,MAXAi,c,d);
for(int i=x;i<=n;i+=i&(-i)) inc(root[i+n],MINAi,MAXAi,c,d*x);
}
int ans[MAXN][2],ans_end[2],ans_siz[2];
void qur(int x)
{
Rep(p,2)
for(int i=x;i;i-=i&(-i)) ans[++ans_siz[p]][p]=root[i+p*n];
}
void turn(bool c)
{
Rep(p,2)
For(i,ans_siz[p])
ans[i][p]=q[ans[i][p]].ch[c];
}
struct comm
{
int p,a,b,c;
comm(){}
}ask[MAXM];
map<long long ,int> h;
int main()
{
// freopen("bzoj3110.in","r",stdin);
// freopen(".out","w",stdout);
scanf("%d%d",&n,&m);
For(i,m) {scanf("%d%d%d%d",&ask[i].p,&ask[i].a,&ask[i].b,&ask[i].c);if (ask[i].p==1) a2[++size]=ask[i].c;}
sort(a2+1,a2+1+size);
size=unique(a2+1,a2+1+size)-(a2+1);
For(i,size) h[a2[i]]=i;
For(i,m)
{
if (ask[i].p==1) ask[i].c=h[ask[i].c];
} For(i,m)
{
int p;
p=ask[i].p;
if (p==1)
{
int l,r,c;
l=ask[i].a,r=ask[i].b,c=ask[i].c;
update(l,c,1);update(r+1,c,-1);
}
else
{
long long l,r,k,l1,r1;
l=ask[i].a,r=ask[i].b,k=ask[i].c;l1=l,r1=r;
ans_siz[0]=ans_siz[1]=0;
qur(r);memcpy(ans_end,ans_siz,sizeof(ans_end));qur(l-1);
l=MINAi,r=MAXAi;
while (l<r)
{
long long s[2]={0},m=(l+r)>>1;
Rep(p,2)
{
For(i,ans_end[p]) s[p]+=q[q[ans[i][p]].ch[1]].c;
long long p1=s[p];s[p]=0;
Fork(i,ans_end[p]+1,ans_siz[p]) s[p]+=q[q[ans[i][p]].ch[1]].c;
if (p==0) s[p]=p1*(r1+1)-s[p]*l1;
else s[p]=p1-s[p];
}
long long tot=s[0]-s[1];
// cout<<tot<<' ';
if (k<=tot) l=m+1,turn(1);else r=m,k-=tot,turn(0);
}
printf("%d\n",a2[l]);
}
}
return 0;
}

BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)的更多相关文章

  1. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

  2. BZOJ 2141 排队(树状数组套主席树)

    解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...

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

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

  4. 【树状数组套主席树】带修改区间K大数

    P2617 Dynamic Rankings 题目描述给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+ ...

  5. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  6. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  7. BZOJ.1901.Dynamic Rankings(树状数组套主席树(动态主席树))

    题目链接 BZOJ 洛谷 区间第k小,我们可以想到主席树.然而这是静态的,怎么支持修改? 静态的主席树是利用前缀和+差分来求解的,那么对于每个位置上的每棵树看做一个点,拿树状数组更新. 还是树状数组的 ...

  8. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  9. BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树

    [题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...

随机推荐

  1. Oracle中的单引号问题

    SELECT '<a href="javascript:void(0)" onclick="openWyl('''||a.aac001 FROM ac01 a; S ...

  2. datetime.datetime.today()生成时间转换成unixtime

    首先要将时间中秒后面的.及其以后的部分去掉,否则时间转换函数 currenttime=str((datetime.datetime.today())).split('.',2)[0] str((dat ...

  3. Hadoop 2.x(YARN)安装配置LZO

    今天尝试在Hadoop 2.x(YARN)上安装和配置LZO,遇到了很多坑,网上的资料都是基于Hadoop 1.x的,基本没有对于Hadoop 2.x上应用LZO,我在这边记录整个安装配置过程 1. ...

  4. iTextSharp

    iTextSharp 116毫秒处理6G的文件   前言: 有一家印刷企业专为米兰新娘,微微新娘,金夫人这样的影楼印刷婚纱相册.通过一个B2B销售终端软件,把影楼的相片上传到印刷公司的服务器,服务器对 ...

  5. spark论坛

    http://spark.apache.org/ http://bbs.csdn.net/forums/spark http://spark.csdn.net/ http://tieba.baidu. ...

  6. 高级特性(7)- 高级AWT

    7.1 绘图操作流程7.2 形状7.3 区域7.4 笔划7.5 着色7.6 坐标变换7.7 剪切7.8 透明与组合7.9 绘图提示7.10 图像的读取器和写入器 7.10.1 获得图像文件类型的读取器 ...

  7. 浙江大学PAT上机题解析之3-05. 求链式线性表的倒数第K项

    给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式说明: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出 ...

  8. Swift - 异步加载各网站的favicon图标,并在单元格中显示

    下面是一个简单的应用,表格视图的各个单元格自动异步加载各个网站的favicon图标,并显示出来. 主要是复习下如何自定义单元格,单元格中图片的异步加载,以及didSet的用法. 效果图如下: 操作步骤 ...

  9. 一张图说清Asp.NET MVC中的 RenderPage、RenderBody、RenderSection

  10. Perl 5 教程

    Perl 5 教程 http://www.cbi.pku.edu.cn/chinese/documents/perl/index.htm