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. 11gR2 集群(CRS/GRID)新功能—— SCAN(Single Client Access Name)

    https://blogs.oracle.com/database4cn/11gr2-crsgrid-scansingle-client-access-name

  2. Android开发时经经常使用的LogUtil

    在开发过程中经经常使用到Log.我们常写的一种方式就是自己定义一个LogUtil工具类 private static boolean LOGV = true; private static boole ...

  3. 编写MyLayer,2 锚点,3 精灵的创建,4 zorder

     1 编写MyLayer 头文件:MyLayer.h #include "cocos2d.h" USING_NS_CC;   //代表的是: using namespace c ...

  4. Linux - 环境变量与位置变量

    环境变量 [root@local ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 注:只有自己执行 ...

  5. nyoj 21--三个水杯(隐式图bfs)

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...

  6. mysqls,为node.js而编写的sql语句生成插件 (crud for mysql).

    It is written in JavaScript,crud for mysql.You can also use transactions very easily. mysqls 一款专为nod ...

  7. 【转】window 安装redis服务、卸载redis服务和启动redis服务

    1.安装redis服务 redis-install.bat 1 echo install redis-server23 D:\redis\redis-server.exe --service-inst ...

  8. MessageDigest的功能及用法(加密解密)

    MessageDigest的功能及用法 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法.信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度 ...

  9. [lua]异步串行流程*协程

    local function param_pack( params, callback ) table.insert(params, callback) return params end local ...

  10. Tomcat 报错 记录

    Resource is out of sync with the file system: 该错误为替换了image中的图片而没有进行更新,造成找不到该资源,进而保存,解决只要eclipse刷新一下F ...