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的操作都在树状数组对应位 ...
随机推荐
- 【XLL API 函数】xlfUnregister (Form 2)
此函数可以被 Excel 已经载入的 XLL 或 DLL 调用.它等效于宏表函数 UNREGISTER. xlfUnregister 有两种调用形式: 形式1:Unregister 单独的命令或函数 ...
- 解决Idea创建maven-archetype-webapp项目无java目录的问题
一.背景 在适用IDEA创建maven-archetype-webapp项目的时候,创建完成后发现在main文件夹下没有java源文件夹,不少小伙伴也遇到该问题,但不知道怎么解决,下面我就来分享解决步 ...
- iOS应用架构谈(二):View层的组织和调用方案(上)
OS客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答iOS应用架构中的种种问题,本文是其中的第二篇,主要讲View层的组织和调用方案.上篇主要讲View层的代码结构. ...
- nodejs链接mongodb数据库
nodeJs链接mongodb数据库有两种方式,第一种是利用官方自己开发的npm包mongodb链接,第二种是利用第三方npm包mongoose链接:这里如果是window操作系统,建议用mongoo ...
- windows一个目录下最大文件数目
对于FAT16文件系统, 可以保存的文件体积最大值是 4 GB - 1 byte (2^32 bytes - 1 byte): 卷的最大体积是4GB:每个卷上最多可以保存的文件数量是65,536个 ( ...
- linux more AND less
================================more================================ more 是我们最常用的工具之一,最常用的就是显示输出的内容, ...
- 模拟赛1030d1
[问题描述]从1− ?中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少.[输入格式]第一行一个数字?.[输出格式]一行一个整数代表答案对100000007取模之后的答案.[样例 ...
- Android自学指导
如果想自学Android,以下的文章可以作为参考: 如何自学Android(Gityuan) 那两年炼就的Android内功修养(老罗的Android之旅)
- [插件]jQuery multiselect初始化及默认值修改
下载地址:http://pan.baidu.com/s/1dE2daSD 1.Jquery多选下拉列表插件jquery multiselect功能介绍及使用 http://www.jb51.net/a ...
- MVC基础知识 – 1.抽象工厂模式
1.调用规则 2.简单工厂 问题:在List.aspx里怎么new一个业务层? 2.1.再在 02SBLL 解决方案里建一个类库 BLL_Tow,也有一个 Users.cs 2.2.建立一个工厂 2. ...