HUST 1407(数据结构)
2014-08-20 23:39
169 查看
1407 - 郁闷的小J
小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架。虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的。具体说来,书架由N个书位组成,编号从1到N。每个书位放着一本书,每本书有一个特定的编码。
小J的工作有两类:
图书馆经常购置新书,而书架任意时刻都是满的,所以只得将某位置的书拿掉并换成新购的书。
小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
……
你的任务是写一个程序来回答每个顾客的询问。
INPUT 第一行两个整数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的书共多少本。
(1<=N,M<=100000,所有出现的书的编码为不大于2147483647的正数。)
OUTPUT 对每一个顾客的查询,输出一个整数,表示顾客所要查询的结果。
sl: 首先随便写了个 线段树套set的方法,不出预料的TLE .
然后又写了个线段树套SBT的写法 ,不能忍的TIE.
最后托人写了个二进制trie的方法 ,AC。但是本若菜不想写虽然很短。
继续yy, 发现用map 吧相同的数字的位置维护一下,这个可以用sbt,或是任何的数据结构都可以吧。然后就能过了。但是不想敲了,囧。
先贴上几份sb了的代码。AC代码随后补上。
正确代码可以参考: http://vjudge.net/vjudge/problem/viewSource.action?id=2690221 (我就不贴了。。)
我的两份 :
1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #include <vector>
5 #include <set>
6 using namespace std;
7 const int MAX = 100000+10;
8 multiset<int> hash[MAX<<2];
9 int a[MAX];
inline int read()
{
int m=0;
char ch=getchar();
while(ch<'0'||ch>'9'){ch=getchar(); }
while(ch>='0'&&ch<='9'){m=m*10+ch-'0'; ch=getchar(); }
return m;
}
void build(int L,int R,int o) {
hash[o].clear();
for(int i=L;i<=R;i++) {
hash[o].insert(a[i]);
}
if(L==R) return ;
int mid=(L+R)>>1;
build(L,mid,o<<1);
build(mid+1,R,o<<1|1);
}
void Update(int L,int R,int o,int pos,int val) {
hash[o].erase(hash[o].find(a[pos]));
hash[o].insert(val);
if(L==R) return ;
int mid=(L+R)>>1;
if(pos<=mid) Update(L,mid,o<<1,pos,val);
else Update(mid+1,R,o<<1|1,pos,val);
}
int Query(int L,int R,int o,int ls,int rs,int val) {
if(ls<=L&&rs>=R) {
return hash[o].count(val);
}
int mid=(L+R)>>1;
int res=0;
if(ls<=mid) res+=Query(L,mid,o<<1,ls,rs,val);
if(rs>mid) res+=Query(mid+1,R,o<<1|1,ls,rs,val);
return res;
}
int main() {
int n,m; char op[10];
int ls,rs,val;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) {
a[i]=read();
}
build(1,n,1);
for(int i=1;i<=m;i++) {
scanf("%s",op);
if(op[0]=='Q') {
ls=read(); rs=read(); val=read();
int ans=Query(1,n,1,ls,rs,val);
printf("%d\n",ans);
}
else {
ls=read(); val=read();
Update(1,n,1,ls,val);
a[ls]=val;
}
}
return 0;
}View Code
相关文章推荐
- HUST-1407 郁闷的小J
- 菜鸟QiFang学数据结构系列(一):一维数组的高级应用--一个可容纳超多位数的求N!的程序!
- 数据结构专栏
- redis 映射数据结构粗略
- 常见数据结构面试题目(二)
- 数据结构链表基础
- 数据结构的重要性
- CRM数据结构--CRM怎么找表
- 数据结构-红黑树(超详细,强烈推荐!!)
- 华容道与数据结构 (11)
- 数据结构方面时间复杂度~空间复杂度
- Python实现各类数据结构和算法---折半查找
- Python学习(四)数据结构 —— bool
- 【Redis笔记(三)】 Redis数据结构 - hash哈希
- 数据结构(四)——队列(C语言实现)
- 002数据结构练习-线性表
- 常见数据结构与算法整理总结
- 数据结构习作之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (技术含量少许)
- 莫名其妙的数据结构学习过程
- 九度 1415 不一样的循环队列 【数据结构】