题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112

经典的动态区间第K大。
用树状数组套线段树。
对原数组建一个树状数组,每个树状数组的结点代表一个线段树,这个线段树以权值为下标,包括这个树状数组的结点包含的区间。
插入的时候可以由树状数组和线段树写法类比,只与logn棵线段树有关,每棵线段树用时logn,总共的时间复杂度n*logn^2。
询问[l,r]的时候,类似与前缀和,找到与l-1有关的logn棵线段树,找到与人有关的logn棵线段树,然后类似于静态区间第K大,判断是往左子树还是右子树,有2logn棵线段树,判断往左子树还是右子树logn次,总共的时间复杂度n*logn^2。
网址上空间比较小,这个程序会MLE。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define re(i,a,b) for(i=a;i<=b;i++)
#define red(i,a,b) for(i=a;i>=b;i--)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define SF scanf
#define PF printf
#define two(k) (1<<(k)) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} const DB EPS=1e-;
inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); inline int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
inline LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const int maxN=;
const int maxM=;
const int maxcnt=maxN+maxM; int N,M;
int a[maxN+];
struct Tdata
{
char type;
int l,r,k,t;
inline void input()
{
type=getchar();while(!(type=='C' || type=='Q'))type=getchar();
if(type=='Q'){l=gint();r=gint();k=gint();}else{l=gint();t=gint();}
}
}data[maxM+]; int bak[maxcnt+],cnt; struct Tnode{int son[],val;}sn[maxcnt*+];int idx;
int tree[maxN+]; inline int newnode(){++idx;sn[idx].son[]=sn[idx].son[]=sn[idx].val=;return idx;}
inline void update(int p,int l,int r,int x,int val)
{
while()
{
sn[p].val+=val;
if(l==r)break;
int mid=(l+r)/;
int f=(x>mid);
if(!sn[p].son[f])sn[p].son[f]=newnode();
if(x<=mid){p=sn[p].son[];r=mid;}else{p=sn[p].son[];l=mid+;}
}
} #define lowbit(a) (a&(-a))
inline void change(int a,int x,int val)
{
for(;a<=N;a+=lowbit(a))
update(tree[a],,cnt,x,val);
} int lge,larr[maxN+],rge,rarr[maxN+];
inline int ask(int l,int r,int k)
{
int i;
l--;
lge=;
for(;l>=;l-=lowbit(l))larr[++lge]=tree[l];
rge=;
for(;r>=;r-=lowbit(r))rarr[++rge]=tree[r];
int x=,y=cnt;
while()
{
if(x==y)return bak[x];
int mid=(x+y)/,G=;
re(i,,rge)G+=sn[sn[rarr[i]].son[]].val;
re(i,,lge)G-=sn[sn[larr[i]].son[]].val;
if(G<k)
{
k-=G;
x=mid+;
re(i,,rge)rarr[i]=sn[rarr[i]].son[];
re(i,,lge)larr[i]=sn[larr[i]].son[];
}
else
{
y=mid;
re(i,,rge)rarr[i]=sn[rarr[i]].son[];
re(i,,lge)larr[i]=sn[larr[i]].son[];
}
}
} int main()
{
freopen("zoj2112.in","r",stdin);
freopen("zoj2112.out","w",stdout);
int i;
for(int Case=gint();Case;Case--)
{
N=gint();M=gint();
re(i,,N)a[i]=gint();
re(i,,M)data[i].input();
cnt=;
re(i,,N)bak[++cnt]=a[i];
re(i,,M)if(data[i].type=='C')bak[++cnt]=data[i].t;
sort(bak+,bak+cnt+);
cnt=unique(bak+,bak+cnt+)-bak-;
re(i,,N)a[i]=lower_bound(bak+,bak+cnt+,a[i])-bak;
re(i,,M)if(data[i].type=='C')data[i].t=lower_bound(bak+,bak+cnt+,data[i].t)-bak;
idx=;
re(i,,N)tree[i]=newnode();
re(i,,N)change(i,a[i],);
re(i,,M)
{
int x;
switch(data[i].type)
{
case 'C':
x=data[i].l;
change(x,a[x],-);
a[x]=data[i].t;
change(x,a[x],);
break;
case 'Q':
printf("%d\n",ask(data[i].l,data[i].r,data[i].k));
break;
}
}
}
return ;
}

zoj2112的更多相关文章

  1. zoj2112 树状数组+主席树 区间动第k大

    Dynamic Rankings Time Limit: 10000MS   Memory Limit: 32768KB   64bit IO Format: %lld & %llu Subm ...

  2. bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)

    bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统) cogs zoj bzoj-权限 题解 bzoj和zoj都是骗访问量的233,我没有 ...

  3. ZOJ2112 Dynamic Rankings(整体二分)

    今天学习了一个奇技淫巧--整体二分.关于整体二分的一些理论性的东西,可以参见XRH的<浅谈数据结构题的几个非经典解法>.然后下面是一些个人的心得体会吧,写下来希望加深一下自己的理解,或者如 ...

  4. zoj2112 主席树动态第k大 (主席树&&树状数组)

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

  5. BZOJ1901 ZOJ2112 线段树+treap (线段树套线段树)

    BZOJ1901: 线段树套线段树做法: (外层线段树 里层动态开节点的权值线段树) 有一个小小的trick 可以省掉二分变成nlog^2n的 就是把查询的区间都取出来- logn个一起走- 2016 ...

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

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

  7. [主席树]ZOJ2112 && BZOJ1901 Dynamic Rankings

    题意:n个数,q个询问 (n<=50000, q<=10000) Q x y z 代表询问[x, y]区间里的第z小的数 C x y    代表将(从左往右数)第x个数变成y 上篇介绍了在 ...

  8. ZOJ2112 Dynamic Rankings 动态区间第K最值 平方分割

    有了上一题的经验(POJ的静态区间第K最值)再解决这道题就轻松多了 空间5256KB,时间3330ms,如果把动态开点的平衡树换成数组模拟的话应该会更快 之所以选择了平方分割而不是树套树,不仅是所谓趁 ...

  9. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

随机推荐

  1. NOI2014 D2T3 购票 简单粗暴解法(凸包维护)

    之前说过这题能用点分治(详见 http://www.cnblogs.com/jasonyu/p/noi2014.html),但其实还有更粗暴的解法. 要求出一个点的答案,我们需要知道树上一段路径的点形 ...

  2. Angular基础教程:表达式日期格式化[转]

    本地化日期格式化: ({{ today | date:'medium' }})Nov 24, 2015 2:19:24 PM ({{ today | date:'short' }})11/24/15 ...

  3. 魅蓝Note有几种颜色 魅蓝Note哪个颜色好看

    http://www.pc841.com/shoujizhishi/39882.html http://news.mydrivers.com/1/359/359443.htm 魅族发布首款千元高性价比 ...

  4. ProtoBuf 的java使用

    碰巧用到Proto,算是笔记吧算是笔记吧, windows : 1,两个文件:proto.exe,  protobuf-java-2.4.1.jar 2,建立一个工程TestPb,在下面建立一个pro ...

  5. vi & vim 基本指令(持续更新ing)

    Abstract:1) 文本编辑模式:                      --INSERT--2)一般模式:                      --i.o.a.R--3)命令行命令模式 ...

  6. 小学生之KTV项目文档(bdqn)

    第一步:创建数据库连接方法和打开方法和关闭方法! 1 public class DBHelper 2 { 3 private string str = "server=.;database= ...

  7. (转)使用Microsoft Web Application Stress Tool对web进行压力测试

    http://www.blogjava.net/crespochen/archive/2009/06/02/279538.html Web压力测试是目前比较流行的话题,利用Web压力测试可以有效地测试 ...

  8. HTML、CSS、JS、PHP 的学习顺序~(零基础初学者)

    如果你有耐心坚持一年以上的话, 我会推荐HTML->CSS->JS->PHP的顺序来学习. 1. HTML学习:首先学习HTML,HTML作为标记语言是非常容易学的,把w3schoo ...

  9. linux 进程备忘

    进程间同步互斥方式: 1.管道pipe(亲属进程适用),命名管道fifopipe 2.信号量 3.共享内存配合信号量

  10. iOS中的UIWindow

    UIWindow的作用 UIWindow主要有两个作用: 1 作为UIView视图的最顶层容器,包含所有要显示的UIView 2 传递触摸,非触摸,键盘事件,其中传递非触摸和键盘事件时,UIWindo ...