洛谷P2464 [SDOI2008] 郁闷的小j [分块]
郁闷的小j
题目描述
小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架。虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的。
具体说来,书架由N个书位组成,编号从1到N。每个书位放着一本书,每本书有一个特定的编码。
小J的工作有两类:
1.图书馆经常购置新书,而书架任意时刻都是满的,所以只得将某位置的书拿掉并换成新购的书。
2.小J需要回答顾客的查询,顾客会询问某一段连续的书位中某一特定编码的书有多少本。
例如,共5个书位,开始时书位上的书编码为1,2,3,4,5
一位顾客询问书位1到书位3中编码为“2”的书共多少本,得到的回答为:1
一位顾客询问书位1到书位3中编码为“1”的书共多少本,得到的回答为:1
此时,图书馆购进一本编码为“1”的书,并将它放到2号书位。
一位顾客询问书位1到书位3中编码为“2”的书共多少本,得到的回答为:0
一位顾客询问书位1到书位3中编码为“1”的书共多少本,得到的回答为:2
……
你的任务是写一个程序来回答每个顾客的询问。
输入输出格式
输入格式:
第一行两个整数N,M,表示一共N个书位,M个操作。
接下来一行共N个整数数A1,A2…AN,Ai表示开始时位置i上的书的编码。
接下来M行,每行表示一次操作,每行开头一个字符
若字符为‘C’,表示图书馆购进新书,后接两个整数A(1<=A<=N),P,表示这本书被放在位置A上,以及这本书的编码为P。
若字符为‘Q’,表示一个顾客的查询,后接三个整数A,B,K(1<=A<=B<=N),表示查询从第A书位到第B书位(包含A和B)中编码为K的书共多少本。
输出格式:
对每一个顾客的查询,输出一个整数,表示顾客所要查询的结果。
输入输出样例
5 5
1 2 3 4 5
Q 1 3 2
Q 1 3 1
C 2 1
Q 1 3 2
Q 1 3 1
1
1
0
2
说明
对于40%的数据,1<=N,M<=5000
对于100%的数据,1<=N,M<=100000
对于100%的数据,所有出现的书的编码为不大于2147483647的正数。
分析:
没错,这是一道$Splay$裸题,但是这里用分快来做。
这题和那道教主的魔法做法基本一样,只是稍有变化。另外,这题数据范围特别大,分块的做法需要吸一口氧气。
Code:
//It is made by HolseLee on 7th Sep 2018
//Luogu.org P2464
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; const int N=1e5+;
int n,m,a[N],b[N],belong[N],l[N],r[N],tot,siz; inline int read()
{
char ch=getchar(); int num=; bool flag=false;
while( ch<'' || ch>'' ) {
if( ch=='-' ) flag=true; ch=getchar();
}
while( ch>='' && ch<='' ) {
num=num*+ch-''; ch=getchar();
}
return flag ? -num : num;
} inline void reset(int x)
{
for(int i=l[x]; i<=r[x]; ++i) b[i]=a[i];
sort(b+l[x],b+r[x]+);
} void build()
{
siz=sqrt(n); tot=n/siz; if( n%siz ) tot++;
for(int i=; i<=n; ++i) belong[i]=(i-)/siz+;
for(int i=; i<=tot; ++i) l[i]=(i-)*siz+, r[i]=i*siz;
r[tot]=n;
for(int i=; i<=tot; ++i) sort(b+l[i],b+r[i]+);
} inline void update(int pos,int v)
{
a[pos]=v;
reset(belong[pos]);
} inline int quary(int x,int y,int z)
{
int ret=;
if( belong[x]==belong[y] ) {
for(int i=x; i<=y; ++i) ret+=(a[i]==z);
return ret;
}
for(int i=x; i<=r[belong[x]]; ++i) ret+=(a[i]==z);
for(int i=l[belong[y]]; i<=y; ++i) ret+=(a[i]==z);
int L,R;
for(int i=belong[x]+; i<belong[y]; ++i) {
L=lower_bound(b+l[i],b+r[i]+,z)-b;
R=lower_bound(b+l[i],b+r[i]+,z+)-b;
ret+=(R-L);
}
return ret;
} int main()
{
n=read(); m=read();
for(int i=; i<=n; ++i) a[i]=read(), b[i]=a[i];
build();
char opt[]; int x,y,z;
for(int i=; i<=m; ++i) {
scanf("%s",opt);
x=read(), y=read();
if( opt[]=='Q' ) {
z=read();
printf("%d\n",quary(x,y,z));
} else {
update(x,y);
}
}
return ;
}
洛谷P2464 [SDOI2008] 郁闷的小j [分块]的更多相关文章
- 2018.09.26 洛谷P2464 [SDOI2008]郁闷的小J(map+vector)
传送门 本来出题人出出来想考数据结构的. 但是我们拥有map+vector/set这样优秀的STL,因此直接用map离散化,vector存下标在里面二分找答案就行了. 代码: #include< ...
- 洛谷P2464 [SDOJ2008]郁闷的小J
洛谷P2464 [SDOJ2008]郁闷的小J 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他 ...
- P2464 [SDOI2008]郁闷的小J
题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的. 具体说 ...
- [SDOI2008]郁闷的小J(分块)
[SDOI2008]郁闷的小J 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危 ...
- fhqtreap - Luogu 2464 [SDOI2008]郁闷的小J
[SDOI2008]郁闷的小JJ 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的 ...
- 【洛谷 P2464】[SDOI2008]郁闷的小J(线段树)
题目链接 这题我很久之前用分块写过,没写出来.. 今天又看到了,于是下决心把这题做出来. 这次我用线段树写的,直接对每本书的编号Hash一下然后离散化然后各建一棵线段树,维护当前编号在某个位置有没有书 ...
- 洛谷 P1984 [SDOI2008]烧水问题
洛谷 P1984 [SDOI2008]烧水问题 题目描述 把总质量为1kg的水分装在n个杯子里,每杯水的质量均为(1/n)kg,初始温度均为0℃.现需要把每一杯水都烧开.我们可以对任意一杯水进行加热. ...
- 山东省选 郁闷的小J
小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的. 具体说来,书架由 ...
- 【山东省选2008】郁闷的小J 平衡树Treap
小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的.具体说来,书架由N ...
随机推荐
- myeclipse注册机,自己生成注册码
话不多少,直接上代码 直接可以运行,自己输入key即可 package com.generate.myeclipse.code; import java.io.BufferedReader; impo ...
- [LeetCode] 31. Next Permutation ☆☆☆
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- Dozer 对象的"搬运工"
前言:项目中,经常会遇到各层对象之间相互进行值传递的过程,如在数据据持久层有一持久类EntityA,在视图层可能会变为ViewA,通常情况下,这两个类的属性 名称 .类型都是一致的, 在两个对象传 ...
- 数学:随机素数测试(Miller_Rabin算法)和求整数素因子(Pollard_rho算法)
POJ1811 给一个大数,判断是否是素数,如果不是素数,打印出它的最小质因数 随机素数测试(Miller_Rabin算法) 求整数素因子(Pollard_rho算法) 科技题 #include< ...
- Unsupervised learning, attention, and other mysteries
Unsupervised learning, attention, and other mysteries Get notified when our free report “Future of M ...
- 前端观察:HTML5做得好,收入不比 iOS 差
谷歌奋进的绿色机器人超过了苹果的市场占有率,这一市场现象,导致了愈来愈多的开发者转投html5的怀抱.而HTML5将成为开发者拥抱同时拥抱Android和IOS的不二法门. 根据著名移动生态系统分析公 ...
- 【CODEVS】1034 家园
[算法]网络流-最大流(dinic) [题解] 飞船有可承载人数限制,地球为源点,月球为汇点,人像水流一样从以飞船上限为容量的边流向汇点. 人在各站点都面临着上船与否的选择,难以用DP解决最优策略,于 ...
- 使用 pjax 载入的新页面,新页面上 类方法 无法被触发?
在父页面上有定义类似 $(".class").click(function(){ ... }) 经过pjax 载入后的新页面 点击后没有触发事件 在segmentfault 上提问 ...
- layui利用jQuery设置下拉列表的值
今天在利用jQuery动态设置下拉列表的值的时候确怎么也赋值不上去,其中用到了layui框架,源代码如下: $.post(contextPath+'/courseLibrary/getCourseBa ...
- Django框架<一>
Django框架 Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Sess ...