题目: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. ajax取返回值的方法

    var check_res; //ajax核对手机验证码 function smsverify(){ var ajaxurl = APP_ROOT+"/index.php?ctl=ajax& ...

  2. 手势触摸定位(UIPanGestureRecognizer)

    /** 1.相对于父坐标系而言,表示当前触摸点所在的位置 */ CGPoint locationPoint = [panGestureRecognizer locationInView:panGest ...

  3. Java里的接口

    Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现. Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现.OOP面向对象的编程,如 ...

  4. [ACM] POJ 1442 Black Box (堆,优先队列)

    Black Box Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7099   Accepted: 2888 Descrip ...

  5. iOS-BLE蓝牙开发持续更新

    文/煜寒了(简书作者)原文链接:http://www.jianshu.com/p/84b5b834b942著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在写这个博客之前,空余时间抽看 ...

  6. 用GDB调试多进程程序

    在子进程中sleep.然后attach上去. gdb --pid=123456 ps出子进程的id,gdb attach 进程号. http://www.ibm.com/developerworks/ ...

  7. Protobuf实现Android Socket通讯开发教程

    本节为您介绍Protobuf实现Android Socket通讯开发教程,因此,我们需要先了理一下protobuf 是什么? Protocol buffers是一种编码方法构造的一种有效而可扩展的格式 ...

  8. C#逻辑运算符详解

    代码如下: namespace ConsoleApplication1 { class @class { static void Main_1(string[] args) //输出用户输入的内容 { ...

  9. Linux内核如何启动并装载一个可执行程序

    2016-04-07 张超<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000#/info 一.理解编译链接的 ...

  10. 服务 Service 基本介绍

    Activity public class MainActivity extends ListActivity {     private boolean flag;//是否开启线程     publ ...