首页 > 其他分享 >BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

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

时间:2022-10-25 10:07:34浏览次数:90  
标签:int long 3110 Zjoi2013 a2 ans ask define BZOJ


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;
}







标签:int,long,3110,Zjoi2013,a2,ans,ask,define,BZOJ
From: https://blog.51cto.com/u_15724837/5793979

相关文章

  • BZOJ 1001([BeiJing2006]狼抓兔子-最大流转对偶图最短路)
    1001:[BeiJing2006]狼抓兔子TimeLimit: 15Sec  MemoryLimit: 162MBSubmit: 5779  Solved: 1297​​Submit​​][​​Status​​][​​Discuss​​]D......
  • BZOJ 1502([NOI2005]月下柠檬树-Simpson积分)
    1502:[NOI2005]月下柠檬树TimeLimit: 5Sec  MemoryLimit: 64MBSubmit: 250  Solved: 148[​​Submit​​][​​Status​​][​​Discuss​​]Descr......
  • BZOJ 1084([SCOI2005]最大子矩阵-长矩阵Dp)
    1084:[SCOI2005]最大子矩阵TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 586  Solved: 275[​​Submit​​][​​Status​​][​​Discuss​​]De......
  • BZOJ 1007(水平可见直线-斜率排序+栈贪心)
    1007:[HNOI2008]水平可见直线TimeLimit: 1Sec  MemoryLimit: 162MBSubmit: 1830  Solved: 656[​​Submit​​][​​Status​​][​​Discuss​​]......
  • BZOJ 4320(ShangHai2006 Homework-询问分段+并查集)
    Description1:在人物集合S中加入一个新的程序员,其代号为X,保证X在当前集合中不存在。2:在当前的人物集合中询问程序员的modY最小的值。(为什么统计这个?因为拯救过......
  • BZOJ 4519([Cqoi2016]不同的最小割-Gusfield算法)
    题意:给一幅图,问2点之间最小割有几个不同取值。1<=N<=8501<=M<=8500Gusfield算法如下:假设一开始所有点均在同一集合任意选定2个不在同一集合点求最小割,割把点集分成......
  • BZOJ 1189([HNOI2007]紧急疏散evacuate-网络流二分+拆点)
    发生了火警,所有人员需要紧急疏散!假设每个房间是一个NM的矩形区域。每个格子如果是’.’,那么表示这是一块空地;如果是’X’,那么表示这是一面墙,如果是’D’,那么表示这是一扇门......
  • BZOJ 2302([HAOI2011]Problem c-组合数学)
    Description给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就......
  • BZOJ 4747-4749题解 Usaco2016 Dec
    BZOJ4747:[Usaco2016Dec]CountingHaybales给出N(1≤N≤100,000)个数,和Q(1≤Q≤100,000)个询问。每个询问包含两个整数A,B(0≤A≤B≤1,000,000,000)。对于每个询问,给出数值......
  • BZOJ 4551([Tjoi2016&Heoi2016]树-倒序并查集)
    Description在2016年,佳媛姐姐刚刚学习了树,非常开心。现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:1.标记操作:对某个结点打上标记(在最开始,只有结点1有标记......