BZOJ 1901 Zju2112 Dynamic Rankings ——整体二分
【题目分析】
上次用树状数组套主席树做的,这次用整体二分去水。
把所有的查询的结果一起进行二分,思路很好。
【代码】
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
#define maxn 100005
#define inf (0x3f3f3f3f)
int read()
{
int x=0,f=1; char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
struct node{
int x,y,k;
int id,opt;
void print() {
printf("%d %d %d %d %d\n", x, y, k, id, opt);
}
}now;
int n,m,a[maxn],ans[maxn];
char s[15];
node q[maxn<<1],q1[maxn],q2[maxn];
int cnt=0,bit[maxn<<1],tot=0;
void add(int x,int f)
{
// printf("add %d %d\n",x,f);
for (;x<=n;x+=x&-x) bit[x]+=f;
}
int sum(int x)
{
int ret=0;
// printf("sum %d ",x);
for (;x;x-=x&-x) ret+=bit[x];
// printf("is %d\n",x,ret);
return ret;
}
void solve(int ql,int qr,int l,int r)
{
// printf("solve %d %d %d %d\n",ql,qr,l,r);
if (ql>qr) return ;
if (l==r)
{
for (int i=ql;i<=qr;++i)
if (q[i].opt==2) ans[q[i].id]=l;
return;
}
int mid=l+r>>1,p1=0,p2=0;
for (int i=ql;i<=qr;++i)
{
if (q[i].opt==1)
{
if (q[i].x<=mid)
{
add(q[i].id,q[i].y);
q1[++p1]=q[i];
}
else q2[++p2]=q[i];
}
else
{
int tmp=sum(q[i].y)-sum(q[i].x-1);
// printf("tmp is %d\n");
if (q[i].k<=tmp) q1[++p1]=q[i];
else
{
// cout<<q[i].x<<" "<<q[i].y<<"goto r "<<endl;
q[i].k-=tmp;
q2[++p2]=q[i];
}
}
}
for (int i=1;i<=p1;++i)
if (q1[i].opt==1)
add(q1[i].id,-q1[i].y);
for (int i=1;i<=p1;++i) q[ql+i-1]=q1[i];
for (int i=1;i<=p2;++i) q[ql+p1+i-1]=q2[i];
// getchar();
solve(ql,ql+p1-1,l,mid);
solve(ql+p1,qr,mid+1,r);
}
int main()
{
n=read();m=read();
for (int i=1;i<=n;++i)
{
a[i]=now.x=read();now.y=1;now.k=inf;
now.id=i; now.opt=1;
q[++cnt]=now;
}
for (int i=1;i<=m;++i)
{
scanf("%s",s);
if (s[0]=='Q')
{
now.x=read();now.y=read();now.k=read();
now.id=++tot;now.opt=2;
q[++cnt]=now;
}
else
{
int xx=read();
now.x=a[xx];now.y=-1;now.k=inf;now.id=xx;now.opt=1;
q[++cnt]=now;
a[xx]=read();
now.x=a[xx];now.y=1;now.k=inf;now.id=xx;now.opt=1;
q[++cnt]=now;
}
}
// for (int i=1;i<=cnt;++i) q[i].print();
solve(1,cnt,0,inf);
for (int i=1;i<=tot;++i) printf("%d\n",ans[i]);
}
BZOJ 1901 Zju2112 Dynamic Rankings ——整体二分的更多相关文章
- bzoj 1901: Zju2112 Dynamic Rankings(树套树)
1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...
- Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6471 Solved: 2697[Su ...
- BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )
BIT 套 splay 其实也是不难...每个 BIT 的结点保存一颗 splay , 询问就二分答案然后判断rank... ------------------------------------- ...
- BZOJ 1901 Zju2112 Dynamic Rankings
树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memor ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
- Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6321 Solved: 2628[Su ...
- BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )
裸的带修改主席树.. 之前用BIT套Splay( http://www.cnblogs.com/JSZX11556/p/4625552.html )A过..但是还是线段树好写...而且快(常数比平衡树 ...
- bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...
- bzoj 1901: Zju2112 Dynamic Rankings【整体二分+树状数组||主席树+树状数组】
整体二分: 对于每一个修改操作,标记为1,并且加一个标记为-1的这个位置原来值,并且对于a数列每个点都当成修改操作 然后整体二分,扫当前操作区间lr,把在值域区间标记为1和-1的操作都在树状数组对应位 ...
随机推荐
- 用css解决iframe的自适应问题(跨域下同样有用)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- Sql Server 保留几位小数的两种做法
数据库里的 float momey 类型,都会精确到多位小数.但有时候 我们不需要那么精确,例如,只精确到两位有效数字. 1. 使用 Round() 函数,如 Round(@num,2) 参数 2 ...
- [Android Pro] 关于inputStream.available()方法获取文件的总大小
reference to :http://hold-on.iteye.com/blog/1017449 如果用inputStream对象的available()方法获取流中可读取的数据大小,通常我们调 ...
- python基础——继承和多态
python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...
- tomcat和apache区别联系
tomcat和apache区别联系 Apache是普通服务器,本身只支持html即普通网页.不过可以通过插件支持php,还可以与Tomcat连通(单向Apache连接Tomcat, 就是说通过Apac ...
- 关于安装Ubuntu后触摸板无法使用的解决方案
安装了Ubuntu后发现触摸板无法使用,以为是修改了安装文件导致(之前拿安装源文件做了小实验),于是重装,之后触摸板仍无法使用,在一个长满小广告的页面上找到了解决方案. 以下是原文章内容: 最近突然发 ...
- 三、jQuery--jQuery基础--jQuery基础课程--第1章 初识jQuery
环境搭建 搭建一个jQuery的开发环境非常方便,可以通过下列几个步骤进行. 下载jQuery文件库 在jQuery的官方网站(http://jquery.com)中,下载最新版本的jQuery文件库 ...
- 七牛:关于图片 EXIF 信息中旋转参数 Orientation 的理解
EXIF(Exchangeable Image File)是 “可交换图像文件” 的缩写,当中包含了专门为数码相机的照片而定制的元数据,可以记录数码照片的拍摄参数.缩略图及其他属性信息,简单来说,Ex ...
- JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)
1.流的简述及演示案例输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出.字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表. ...
- Pyqt 以OOP方式动画的效果改变自身窗体大小
代码: # -*- coding:utf8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys class ani( ...