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. Linux下Django开发学习(一)

    一,环境配置: 环境:Ubuntu 14.04 LTS, Python 2.7,  Django 1.8 安装Python : Ubuntu自带python2.7,不用安装 安装pip:sudo ap ...

  2. BZOJ 1004: [HNOI2008]Cards( 置换群 + burnside引理 + 背包dp + 乘法逆元 )

    题意保证了是一个置换群. 根据burnside引理, 答案为Σc(f) / (M+1). c(f)表示置换f的不动点数, 而题目限制了颜色的数量, 所以还得满足题目, 用背包dp来计算.dp(x,i, ...

  3. USACO March. 2012

    Connect the Cows Times17 水题 Landscaping Flowerpot Tractor 广搜 搜到边界就可以终止了 没什么难度 #include <stdio.h&g ...

  4. windows 下搭建 apache + php52 + postgreSQL7/8/9环境

    apache和php安装参考:[转]Windows7 64bit下配置Apache+PHP+MySQL 我这主要讲配置  apache 支持 postgresql9数据库: 1.将php5文件夹下的p ...

  5. ELK 之三:Kibana 使用与Tomcat、Nginx 日志格式处理

    一:kibana安装: kibana主要是搜索elasticsearch的数据,并进行数据可视化的展现,新版使用nodejs. 1.下载地址: https://www.elastic.co/downl ...

  6. android网络交互之DNS优化知识整理

    android网络交互之DNS优化知识整理 之前的工作中,经常会遇到DNS解析出问题导致网络交互的操作无法正常进行. UnknownHostException 在很多的移动开发过程中,与服务端的交互的 ...

  7. php函数参数

    函数的参数 通过参数列表可以传递信息到函数,即以逗号作为分隔符的表达式列表.参数是从左向右求值的. PHP 支持按值传递参数(默认),通过引用传递参数以及默认参数.也支持可变长度参数列表,更多信息参见 ...

  8. php利用iframe实现无刷新文件上传功能

    上传原理很简单就是利用表单的打开方式为iframe的name名,这样就可以在当前页面的iframe打来了,实现文件上传,再利用js返回上传结果. form target .在 action 属性中规定 ...

  9. PyDev下PyQt 的尝试

    刚刚装完PyDev ,试了下之前写的调用PyQt的下代码,发现运行出错:搜索只还需在System PYHONPATH下 添加PyQt的路径,步骤如下: eclipse--window--Prefere ...

  10. C# 课堂总结1-二进制转换

    一.目的:便于计算机表示,稳定性好,符合逻辑运算,真为1,假为0. 二.各进制表示方法: 2进制:0,1 8进制:0-7 16进制:0-9,A,B,C,D,E,F 二.转换方法: 1.各进制转换为10 ...