dynamic rankings这道题的思想一样

只不过是把树状数组换成线段树区间修改,求第$K$大的而不是第$K$小的

这道题还有负数,需要离散

 #include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 50500
#define M1 100500
#define ll long long
#define dd double
#define inf 233333333
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
ll gll()
{
ll ret=;int fh=; char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
} struct SEG{
ll sum[N1<<],tag[N1<<];int use[N1<<],que[N1<<],tl;
void pushdown(int l,int r,int rt)
{
if(!tag[rt]) return;
int mid=(l+r)>>;
sum[rt<<]+=tag[rt]*(mid-l+); tag[rt<<]+=tag[rt];
sum[rt<<|]+=tag[rt]*(r-mid); tag[rt<<|]+=tag[rt];
if(!use[rt<<]) use[rt<<]=,que[++tl]=rt<<;
if(!use[rt<<|]) use[rt<<|]=,que[++tl]=rt<<|;
tag[rt]=;
}
void pushup(int rt){ sum[rt]=sum[rt<<]+sum[rt<<|]; }
void update(int L,int R,int l,int r,int rt,int w)
{
if(!use[rt]) use[rt]=,que[++tl]=rt;
if(L<=l&&r<=R){ sum[rt]+=(r-l+)*w; tag[rt]+=w; return;}
int mid=(l+r)>>; pushdown(l,r,rt);
if(L<=mid) update(L,R,l,mid,rt<<,w);
if(R>mid) update(L,R,mid+,r,rt<<|,w);
pushup(rt);
}
ll query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) return sum[rt];
int mid=(l+r)>>; ll ans=; pushdown(l,r,rt);
if(L<=mid) ans+=query(L,R,l,mid,rt<<);
if(R>mid) ans+=query(L,R,mid+,r,rt<<|);
return ans;
}
void clr(){ while(tl){ use[que[tl]]=; sum[que[tl]]=; tag[que[tl]]=; que[tl--]=; } }
}s;
struct node{int fl,l,r,ans,t;ll K;}a[N1],tmp[N1];
int n,m,ma,nn;
int f[N1],w[N1],use[N1]; void alldic(int l,int r,int ql,int qr)
{
if(l>r||ql>qr) return;
int mid=(l+r)>>,i,j,S=ql,E;ll sum;
for(i=ql;i<=qr;i++)
{
if(a[i].fl==){
if(a[i].K>=mid){ s.update(a[i].l,a[i].r,,n,,); use[i]=; }
if(a[i].K>mid){ tmp[S++]=a[i]; }
}else{
sum=s.query(a[i].l,a[i].r,,n,);
if(sum<a[i].K){ a[i].K-=sum; }
else{ f[a[i].t]=w[mid]; tmp[S++]=a[i]; use[i]=; }
}
}
for(i=ql,E=S;i<=qr;i++)
{
if(!use[i]){ tmp[E++]=a[i]; }
else{ use[i]=; }
}
for(i=ql;i<=qr;i++) a[i]=tmp[i];
s.clr();
alldic(mid+,r,ql,S-); alldic(l,mid-,S,E-);
} int main()
{
scanf("%d%d",&n,&m);
int i,j; memset(f,-,sizeof(f));
for(i=;i<=m;i++){ a[i].fl=gint(); a[i].l=gint(); a[i].r=gint(); a[i].K=gll(); a[i].t=i; if(a[i].fl==) w[++ma]=a[i].K; }
sort(w+,w+ma+); ma=unique(w+,w+ma+)-(w+);
for(i=;i<=m;i++){ if(a[i].fl==) a[i].K=lower_bound(w+,w+ma+,a[i].K)-w; }
alldic(,ma,,m);
for(i=;i<=m;i++) if(f[i]!=-) printf("%d\n",f[i]);
return ;
}

BZOJ 3110 [ZJOI2013]K大数查询 (整体二分+线段树)的更多相关文章

  1. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  2. BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]

    有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...

  3. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  4. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  5. BZOJ 3110 [Zjoi2013]K大数查询 (CDQ分治+树状数组)

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...

  6. BZOJ 3110 [Zjoi2013]K大数查询(整体二分)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 11654  Solved: 3505[Submit][St ...

  7. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

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

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

  9. 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 &amp; 3236 [Ahoi2013] 作业 题解

    [原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 978  Solved: 476 Descri ...

随机推荐

  1. 浅析IT系统监控方法和应用

    浅析IT系统监控方法和应用 http://blog.csdn.net/zhangman117/article/details/35549363

  2. code vs 3305 水果姐逛水果街Ⅱ

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 水果姐第二天心情也很不错, ...

  3. C++:探究纯虚析构函数以及实现数组的高速排序与链表的归并排序

    C++:探究纯虚析构函数以及实现数组的高速排序与链表的归并排序 标签: 数据结构 数组 链表 高速排序 归并排序 抽象类 虚继承 by 小威威 1.介绍 本篇博文将通过课后作业的(15 C++ Hom ...

  4. pomelo研究笔记-RPC服务端

    POMELO 採用多进程的架构能够非常好的实现游戏server(进程)的扩展性,达到支撑较多在线用户.减少server压力等要求. 进程间通信採用RPC的形式来完毕,pomelo的RPC实现的相当静止 ...

  5. JS判断手机浏览器内核

    function is_weixn_qq() { var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) ...

  6. objective-c 中数据类型之四 字典(NSDictionary)

    // 1. 字典初始化.赋值方式1 NSMutableDictionary *m_dictionary = [[NSMutableDictionary alloc] initWithCapacity: ...

  7. Dungeon Master hdoj

    Dungeon Master Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Tot ...

  8. php Aes 128位算法

    <?php class Mcrypt { private static $key = "fsdjfojojodjiovjojgfosdjfiojio"; private st ...

  9. position记录元素原始位置

    position记录元素原始位置 css样式: li { width: 100px; height: 100px; margin: 10px 0 0 10px; background-color: # ...

  10. getElementsByName使用

    查了下手册,getElementsByName()不能提取没有name属性的标签.div标签本身没有name属性,所以不能被提取.有name标签的主要是各种input标签,所以默认情况下getElem ...