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> ...
随机推荐
- eclipse+python+Anaconda ML环境搭建
整个流程按照这个来: http://blog.csdn.net/olaking/article/details/42435451 你会发现pydev安装不了,听说服务器被和谐了,下面这篇文章告诉你如何 ...
- BZOJ 3040: 最短路(road) ( 最短路 )
本来想学一下配对堆的...结果学着学着就偏了... 之前 kpm 写过这道题 , 前面的边不理它都能 AC .. 我也懒得去写前面的加边了... 用 C++ pb_ds 库里的 pairing_hea ...
- 利用Tomcat的用户名和密码构建“永久”后门
从本案例中可以学到: (1)关于JSP的一些基础知识 (2)利用Tomcat的用户名和密码来构建后门 本文首先要感谢<黑客手册>“非安全.后生”编辑为本为提供了帮助,还要感谢网友“伤心的鱼 ...
- cmake 学习笔记(一)
最大的Qt4程序群(KDE4)采用cmake作为构建系统 Qt4的python绑定(pyside)采用了cmake作为构建系统 开源的图像处理库 opencv 采用cmake 作为构建系统 ... 看 ...
- HDU1316(求区间斐波那契数的个数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1316 题意:给两个数a和b,其中它们可能很大,最大到10^100,然后求去区间[a,b]内有多少个fib数 ...
- grep命令參数及使用方法
功能说明:查找文件中符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- SQLyog 注册码
用户名: 随意填写 秘钥: ccbfc13e-c31d-42ce-8939-3c7e63ed5417a56ea5da-f30b-4fb1-8a05-95f346a9b20ba0fe8645-3916- ...
- C-最长回文子串(1)
最长回文子串,就是在字符串中找到最长的对称的子串. s是一个字符串. int max = 0; for(i = 0;i<m;i++) for(j = i;j<m;j++) if(s[i.. ...
- 深入windows的关机消息截获-从XP到Win7的变化
之前写了一个软件用于实验室的打卡提醒,其中一个重要的功能是在关机之前提醒当天晚上是否已经打卡.之前我是在WM_ENDSESSION中弹出一个模态对话框来提醒,在XP中基本工作正常,在Win7中大多数时 ...
- silentScroll() 滚屏
jQuery.mobile.silentScroll( yPos ) 滚动到一个特定的Y坐标位置,没有触发涡旋的事件监听器 yPos:Y坐标.类型:数字.默认值: //滚屏到y 100px处 $.mo ...