【题意】

  给定一个含有n个数的序列a[1],a[2],a[3]……a[n],

  程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。

  对于每一个询问指令,你必须输出正确的回答。

  第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。

  分别表示序列的长度和指令的个数。第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。

   Q i j k 或者 C i t Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。

【分析】

  带修改的区间第k大。

  如果只是询问区间的第k大的话,就是可持久化字母树。

  然后,其实我想了挺久。。。。可以看看GDXB的题解。。http://www.cnblogs.com/KonjakJuruo/p/6031832.html

  她打的是树状数组套线段树。 其实就是树状数组搞区间,然后线段树搞数值。

  因为带修改的话,是动态的。相当于不修改的时候,我们只要记录前缀和,就可以知道某段区间的和(两个前缀相减),但是修改了之后,就要用树状数组或者线段树等维护。

  这个也是这个道理,用数据结构维护区间。

  本蒟蒻打的是线段树套字母树(区间第k大,深爱字母树,耶!)

  其实树状数组套字母树应该更简单??

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 10010
#define Maxd 32 int a[Maxn],nw[Maxn],al;
char s[]; struct trie
{
int son[],cnt;
}tr[Maxn**];int tot; void upd(int x)
{
tr[x].son[]=tr[x].son[]=;
tr[x].cnt=;
} void add(int now,int y,int c)
{
for(int i=Maxd;i>=;i--)
{
int ind=y>>i-;
y=y%(<<i-);
if(!tr[now].son[ind])
{
tr[now].son[ind]=++tot;
upd(tot);
}
now=tr[now].son[ind];
tr[now].cnt+=c;
}
} int query(int k)
{
int ans=;
for(int i=Maxd;i>=;i--)
{
int ls=;
for(int j=;j<=al;j++) ls+=tr[tr[nw[j]].son[]].cnt;
if(ls>=k)
{
for(int j=;j<=al;j++) nw[j]=tr[nw[j]].son[];
}
else
{
k-=ls;
ans+=(<<i-);
for(int j=;j<=al;j++) nw[j]=tr[nw[j]].son[];
}
}
return ans;
} struct node
{
int l,r,lc,rc,rt;
}t[Maxn*];int len; int build(int l,int r)
{
int x=++len;
t[x].l=l;t[x].r=r;t[x].rt=++tot;
upd(tot);
if(l!=r)
{
int mid=(l+r)>>;
t[x].lc=build(l,mid);
t[x].rc=build(mid+,r);
}
else t[x].lc=t[x].rc=;
return x;
} void change(int x,int y,int z)
{
add(t[x].rt,z,);
if(a[y]!=-) add(t[x].rt,a[y],-);
if(t[x].l==t[x].r) return;
int mid=(t[x].l+t[x].r)>>;
if(y<=mid) change(t[x].lc,y,z);
else change(t[x].rc,y,z);
} void ffind(int x,int l,int r)
{
if(t[x].l==l&&t[x].r==r)
{
nw[++al]=t[x].rt;
return;
}
int mid=(t[x].l+t[x].r)>>;
if(r<=mid) ffind(t[x].lc,l,r);
else if(l>mid) ffind(t[x].rc,l,r);
else
{
ffind(t[x].lc,l,mid);
ffind(t[x].rc,mid+,r);
}
} int n,m;
void init()
{
len=;tot=;
scanf("%d%d",&n,&m);
build(,n);
memset(a,-,sizeof(a));
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
change(,i,x);
a[i]=x;
}
} int main()
{
init();
for(int i=;i<=m;i++)
{
scanf("%s",s);
if(s[]=='C')
{
int x,y;
scanf("%d%d",&x,&y);
change(,x,y);
a[x]=y;
}
else
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
al=;
ffind(,x,y);
printf("%d\n",query(k));
}
}
return ;
}

2016-11-08 14:33:10

话说树套树的离线题可以用CDQ分治??

不会。。

【BZOJ1901】 Zju2112 Dynamic Rankings(树套树)的更多相关文章

  1. BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...

  2. bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)

    带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀.  对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了.  3k4人AC的题#256...应该不算慢 #incl ...

  3. BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9094  Solved: 3808[Submit][Status][Discuss] Descript ...

  4. [BZOJ1901]Zju2112 Dynamic Rankings

    [BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...

  5. [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】

    题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...

  6. 主席树初探--BZOJ1901: Zju2112 Dynamic Rankings

    n<=10000的序列做m<=10000个操作:单点修改,查区间第k小. 所谓的主席树也就是一个值域线段树嘛..不过在这里还是%%fotile 需要做一个区间查询,由于查第k小,需要一些能 ...

  7. BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )

    BIT 套 splay 其实也是不难...每个 BIT 的结点保存一颗 splay , 询问就二分答案然后判断rank... ------------------------------------- ...

  8. BZOJ1901——Zju2112 Dynamic Rankings

    1.题目大意:区间第k小,有单点修改 2.分析:这个是树状数组套线段树,也是主席树....为什么主席树这么多QAQ 就是树套树的那种插入什么的,注意啊,一定要动态开内存..不然会爆.. 然后算答案有两 ...

  9. BZOJ1901 Zju2112 Dynamic Rankings 【树状数组套主席树】

    题目 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j- ...

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

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

随机推荐

  1. mysql中查询某字段所在的表方法

    select TABLE_NAME from information_schema.COLUMNS where COLUMN_NAME = 'type'

  2. JS调用ashx文件传递中文参数取不到值的解决方案

    引自:http://www.cnblogs.com/yinpeng186/archive/2011/09/30/2196726.html

  3. VS2010常用插件介绍之Javascript插件(一)

    引自:http://blog.csdn.net/cyxlzzs/article/details/6583577 今天在写JS时,写到500多行时,感觉代码已经很难看了.想到C#代码都有折叠功能,是不是 ...

  4. 新增的html5中js获取方法

    一.querySelector   获取的选择器与jquery的选择器相同

  5. visio篇章--1

    因为要做需求规格说明书的需要,所以学着用visio.发现visio中其实有很多东西的.我昨晚是用它来画ER图.不画不知道,花了之后才发现有很多窍门在里面.不说废话.我列举一下应该要的东西 1.百度链接 ...

  6. Ubuntu 12.04安装PPTP

    1.安装软件 sudo apt-get install pptpd ufw 2.编辑/etc/ppp/pptpd-options 找到 refuse-pap refuse-chap refuse-ms ...

  7. 最简单的基于Flash的流媒体示例:网页播放器(HTTP,RTMP,HLS)

    http://blog.csdn.net/leixiaohua1020/article/details/43936415 ======================================= ...

  8. ubuntu14.04下安装Naigos和pnp4nagios

    Nagios是一个监视系统运行状态和网络信息的监视系统.Nagios能监视所指定的本地或远程主机以及服务,同时提供异常通知功能等. 安装环境:ubuntu14.04,全是最新的nagios和nagio ...

  9. Solr4.8.1与Tomcat7整合

    Solr4.8.1和Tomcat7都可以到官方网站去下载,我这里就不多说了,如下图. 这里我们首先解压Solr-4.8.1.zip,再解压Tomcat,解压后,再在当前文件夹下建2个文件夹,一个用来放 ...

  10. switch case实现两个数的算术运算

    方法一: package com.liaojianya.chapter1; import java.util.Scanner; public class SwitchDemo1 { public st ...