题目大意:略

洛谷传送门 这道题在洛谷上数据比较强

貌似这个题比较常见的写法是树状数组套主席树,动态修改

我写的是整体二分

一开始的序列全都视为插入

对于修改操作,把它拆分成插入和删除两个操作

像$CDQ$分治一样,用结构体记录操作的位置,修改的权值等

假设为需要处理的询问分配了一个答案$mid$

查询区间第$K$小,我们只需要查询区间内权值为$[l,mid]$的数有几个

每次插入/删除,都看这次操作修改的权值是否$\in[l,mid]$

如果是,说明这个它对答案有贡献,在它在原序列的位置上$+1$,那么某个区间权值为$[l,mid]$的数就是查询前缀和,用树状数组维护

反之都是没贡献的

如果超过了$K$个,说明第$K$小的数小于等于$mid$,把它扔到左区间递归

如果小于$K$个,说明第$K$小的数一定大于$mid$,$K-=mid$,把它扔到右区间递归

插入删除操作也要按权值分左右区间递归

注意不要破坏时间序!

 #include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 105000
#define M1 205000
#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;
}
int n,m,nn;
struct BIT{
int sum[N1];
void update(int x,int w){ for(int i=x;i<=n;i+=(i&(-i))) sum[i]+=w; }
int query(int x){ int ans=; for(int i=x;i;i-=(i&(-i))) ans+=sum[i]; return ans;}
void clr(int x){ for(int i=x;i<=n;i+=(i&(-i))) sum[i]=; }
}s;
struct node{int i,j,k,t,id;}a[N1+M1],tmp[N1+M1];
int w[M1],ma,que[N1+M1],tl,f[N1],c[N1],use[N1+M1]; 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,sum;
for(i=ql;i<=qr;i++)
{
if(!a[i].k){
if(a[i].j<=mid){ s.update(a[i].i,); que[++tl]=a[i].i; use[i]=; }
if(a[i].j<mid) tmp[S++]=a[i];
}else if(a[i].k==-){
if(a[i].j<=mid){ s.update(a[i].i,-); que[++tl]=a[i].i; use[i]=; }
if(a[i].j<mid) tmp[S++]=a[i];
}else{
sum=s.query(a[i].j)-s.query(a[i].i-);
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]) use[i]=;
else tmp[E++]=a[i];
}
while(tl){ s.clr(que[tl--]); }
for(i=ql;i<=qr;i++) a[i]=tmp[i];
alldic(l,mid-,ql,S-); alldic(mid+,r,S,E-);
}
char str[]; int main()
{
scanf("%d%d",&n,&m);
int i,j;
for(i=;i<=n;i++){ nn++; a[nn].j=gint(); a[nn].i=i; w[++ma]=a[nn].j; c[i]=a[i].j; }
for(i=;i<=m;i++)
{
scanf("%s",str);
if(str[]=='Q'){
nn++; a[nn].i=gint(); a[nn].j=gint(); a[nn].k=gint(); a[nn].t=i;
}else{
nn++; a[nn].k=-; a[nn].i=gint(); a[nn].j=c[a[nn].i];
nn++; a[nn].k=; a[nn].i=a[nn-].i; a[nn].j=gint();
c[a[nn].i]=a[nn].j; w[++ma]=a[nn].j;
}
f[i]=-;
}
sort(w+,w+ma+); ma=unique(w+,w+ma+)-(w+);
for(i=;i<=nn;i++) if(a[i].k<=) a[i].j=lower_bound(w+,w+ma+,a[i].j)-w;
alldic(,ma,,nn);
for(i=;i<=m;i++) if(f[i]>=) printf("%d\n",f[i]);
return ;
}

BZOJ 1901 Dynamic Rankings (整体二分+树状数组)的更多相关文章

  1. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  2. BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9094  Solved: 3808[Submit][Status][Discuss] Descript ...

  3. BZOJ.1901.Dynamic Rankings(整体二分)

    题目链接 BZOJ 洛谷 (以下是口胡) 对于多组的询问.修改,我们可以发现: 假设有对p1,p2,p3...的询问,在这之前有对p0的修改(比如+1),且p0<=p1,p2,p3...,那么我 ...

  4. BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)

    题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...

  5. BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)

    整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...

  6. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  7. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

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

  8. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  9. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

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

随机推荐

  1. 一个简单的ant应用

    <pre name="code" class="html"><?xml version="1.0" encoding=&q ...

  2. Dagger2使用攻略

    Dagger2使用攻略 Dagger 2 是 Square 的 Dagger 分支,是一种依赖注入框架.眼下由 Google 接手进行开发,Dagger2是使用代码自己主动生成和手写代码来实现依赖注入 ...

  3. Python3 pymysql连接MySQL数据库

    #!/usr/bin/python # -*- coding:utf8 -*- import pymysql #取得数据库连接对象 conn = pymysql.connect(host='127.0 ...

  4. iOS 8 模糊视图(毛玻璃效果)的简单实现UIVisualEffectView

    在须要模糊的UIView上.加入一个UIVisualEffectView对象就可以. 效果例如以下图: 代码例如以下: UIImageView *imageview = [[UIImageViewal ...

  5. [2-SAT] poj 3207 Ikki&#39;s Story IV - Panda&#39;s Trick

    题目链接: id=3207">http://poj.org/problem? id=3207 Ikki's Story IV - Panda's Trick Time Limit: 1 ...

  6. luogu4012 深海机器人问题 网络流

    关键词:最小费用最大流 题目大意:海底是个网格,每个网格边有一定价值的海底化石.每个路线可经过无限个机器人,但上面的化石只能采一次.机器人可沿网格边向东或向北移动.给定机器人起点和终点位置及所能容纳的 ...

  7. Node.js:Buffer

    ylbtech-Node.js:Buffer 1.返回顶部 1. Node.js Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文 ...

  8. 框架-Java:Spring Cloud

    ylbtech-框架-Java:Spring Cloud Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册. ...

  9. Unsupported major.minor version 52.0 (unable to load class XXX

    java项目构建从高版本JDK改为低版本JDK报错.这是再次编译时使用的JDK版本比你原来编译的版本低所导致的. 转自:http://blog.csdn.net/zixiao217 maven项目在服 ...

  10. Gym-100935I Farm 计算几何 圆和矩形面积交

    题面 题意:就是给你一个圆,和你一个矩形,求面积并,且 保证是一种情况:三角剖分后 一个点在圆内 两个在圆外 题解:可以直接上圆与凸多边形交的板子,也可以由这题实际情况,面积等于扇形减两个三角形 #i ...