BZOJ 1901 Dynamic Rankings (整体二分+树状数组)
题目大意:略
洛谷传送门 这道题在洛谷上数据比较强
貌似这个题比较常见的写法是树状数组套主席树,动态修改
我写的是整体二分
一开始的序列全都视为插入
对于修改操作,把它拆分成插入和删除两个操作
像$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 (整体二分+树状数组)的更多相关文章
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9094 Solved: 3808[Submit][Status][Discuss] Descript ...
- BZOJ.1901.Dynamic Rankings(整体二分)
题目链接 BZOJ 洛谷 (以下是口胡) 对于多组的询问.修改,我们可以发现: 假设有对p1,p2,p3...的询问,在这之前有对p0的修改(比如+1),且p0<=p1,p2,p3...,那么我 ...
- BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)
题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...
- BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)
整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
随机推荐
- mysql绑定多个ip地址
http://jpuyy.com/2013/07/mysql-bind-multi-address.html mysql绑定多个ip地址 发表于2013 年 7 月 1 日 my.cnf中有选项bin ...
- python Flask JQuery使用说明
0.前言 近期因为某种原因再次学习Flask框架.借助博客整理相关内容.Flask框架和Apache+PHP存在少许不同,Flask框架中JS和CSS文件存放于一个相对固定的位置. 普通情况下 ...
- 数据结构之---C++语言实现图的十字链表存储表示
近期一直忙着考研复习,非常久都没有更新博客了.今天写一篇数据结构的存储. //有向图的十字链表存储表示 //杨鑫 #include <iostream> #include <cstd ...
- Struts简单介绍
一.在介绍struts之前,先来了解一下什么是MVC框架吧. 1.MVC介绍 MVC全名是Model View Controller.是模型(model)-视图(view)-控制器(controlle ...
- 委托delegate,Action,Func,Predicate
C#委托的介绍(delegate.Action.Func.predicate) 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 ...
- grpc vs2015编译
获取gRPC源码 gRPC是开源框架,项目代码在github上,所以首先要安装github.github安装后,在指定文件夹中,执行git命令就可以获取gRPC的所有源码. git clone ht ...
- 关于类和对象的进一步讨论 C++
如果一个类中所有成员函数都是公用的,则可以在定义对象时对数据成员进行初始化: class Time { public: hour; minute; sec; }; Time t1={14,15,23 ...
- 9.19[XJOI] NOIP训练37
上午[XJOI] NOIP训练37 T1 同余方程 Problem description 已知一个整数a,素数p,求解 $x^{2}\equiv a(mod p) $ 是否有整数解 Solution ...
- WinForm中DataReader绑定到DataGridView的两种方法
在WinForm中,DataReader是不能直接绑定到DataGridView的,我想到了用两种方法来实现将DataReader绑定到DataGridView. SqlCommand command ...
- Spark Streaming概念学习系列之Spark Streaming容错
Spark Streaming容错 检查点机制-checkpoint 什么是检查点机制? Spark Streaming 周期性地把应用数据存储到诸如HDFS 或Amazon S3 这样的可靠存储系统 ...