BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
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
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
本来上一次就偷懒。。。、
话说写线段树不写离散化可不是一个好习惯。。。
所以我果断加上了离散。。。
================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大[段修改,在线]-树状数组套函数式线段树)的更多相关文章
- BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树
题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...
- BZOJ 2141 排队(树状数组套主席树)
解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- 【树状数组套主席树】带修改区间K大数
P2617 Dynamic Rankings 题目描述给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+ ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解
题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...
- BZOJ.1901.Dynamic Rankings(树状数组套主席树(动态主席树))
题目链接 BZOJ 洛谷 区间第k小,我们可以想到主席树.然而这是静态的,怎么支持修改? 静态的主席树是利用前缀和+差分来求解的,那么对于每个位置上的每棵树看做一个点,拿树状数组更新. 还是树状数组的 ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树
[题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...
随机推荐
- N皇后( DFS,推荐)
N皇后问题 Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任 ...
- uboot编译: uboot编译配置和编译过程
jz2440: 韦东山Linux视频第1期_裸板_UBoot_文件系统_驱动初步\第09课第2节 u-boot分析之Makefile结构分析.WMV <嵌入式linux完全开发手册> 15 ...
- 随手记今天跟的几个iOS项目代码的问题
休了一阵子假期,今天刚回来上班,项目代码已经有挺大的变化了,我就先体验.发现.跟进问题. 第一个问题是点击某个cell就挂掉的现象,同事表示必现但挺神奇.由于挂掉的时候没有啥有意义的信息,所以先简单粗 ...
- hdu 2757 Ocean Currents(优先队列+bfs)
小伙伴们真心被这道题惊呆了!刚开始是读题,题目都把小伙伴惊呆了,题目都读不懂! 在前面猴子小伙伴的帮助下,理解了一点点,又偷偷的在纸上写写画画,明白了题意! 后来,你懂的,果断拿下!在拿下的过程也经过 ...
- cygrunsrv: Error starting a service: QueryServiceStatus: Win32 error 1062: 解决办法
问题原因:很可能是/var/log的权限设置不正确.首先执行 mkpasswd 和 mkgroup 重新生成权限信息,再删除sshd服务,重新配置 解决办法: $ mkpasswd -l > / ...
- Windows多线程
//简单的引出多线程是肿么回事儿....当点击下载的时候,下载内容还没结束也可以点击资源库,其实这就用了另一个线程,弹出“下载完成”对话框的时候,没有点击确定是不能点击主页面内容的,这就是用----- ...
- SVN - 笔记
SVN(版本控制) 1.什么是SVN · 多人共同开发同一个项目,内部最大的问题是,在比较短的时间内如果有多人同时开发同一个文件,会造成彼此的代码相互覆盖的情况发生. · 管理着随时间改变的数据,这些 ...
- 七、Nginx学习笔记七Nginx的Web缓存服务
user www; worker_processes 1; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/l ...
- Win7 和 MAC 系统通过VMware共享文件夹(简单又好用,几乎什么都不用设置)
Win7是Server,Mac是Client,VMware上运行Mac系统 1.在VMware的Options菜单中选择Shared Folders选项 2.选择Always enabled选项 3. ...
- 基于visual Studio2013解决算法导论之005原地随机排列数组
题目 原地随机排列数组 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> ...