HUST 1407(数据结构)
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 (我就不贴了。。)
我的两份 :

];
];
];
];
; lch[] = rch[] = sz[] = ; }
; }
== sz[root]; }
); }
+ sz[lch[t]] + sz[rch[t]];
+ sz[lch[t]] + sz[rch[t]];
== t) == k) }
Type GetSuc( == root) Type tmp = GetSuc(lch[t], k);
}
Type GetKth( ) );
}
== t) ;
+ GetRank(rch[t], k);
}
== t) ;
+ GetSmaller(rch[t], k);
}
== t) }
== t) {
t = ++tot;
lch[t] = rch[t] = ;
sz[t]= ;
key[t] = k;
}
sz[t]++;
Maintain(t, k >= key[t]);
}
== t) t = rch[t];
DeleteSmaller(t , key);
} DeleteSmaller(lch[t] , k);
sz[t] = + sz[lch[t]] + sz[rch[t]];
}
}
Type Delete( sz[t]--;
== lch[t]) || (k > key[t] && == rch[t])) {
Type tmp = key[t];
== lch[t] || == rch[t]) {
t = lch[t] + rch[t];
} key[t] = Delete(lch[t], key[t] + );
}
} } }
}
}
};
SBT<];
inline {
;
+ch- }
sbt[o].InsertR(a[i]);
}
;
build(L,mid,o<<);
build(mid+,R,o<<|);
}
sbt[o].Delete(a[pos]);
sbt[o].InsertR(val);
;
,pos,val);
,R,o<<|,pos,val);
}
);
}
;
;
,ls,rs,val);
,R,o<<|,ls,rs,val);
}
];
) {
;i<=n;i++) {
a[i]=read();
}
build(,n,);
;i<=m;i++) {
scanf( ]== ls=read(); rs=read(); val=read();
,n,,ls,rs,val);
printf( }
ls=read(); val=read();
Update(,n,,ls,val);
a[ls]=val;
}
}
}
;
}

];
inline {
;
+ch- }
hash[o].clear();
hash[o].insert(a[i]);
}
;
build(L,mid,o<<);
build(mid+,R,o<<|);
}
hash[o].erase(hash[o].find(a[pos]));
hash[o].insert(val);
;
,pos,val);
,R,o<<|,pos,val);
}
}
;
;
,ls,rs,val);
,R,o<<|,ls,rs,val);
}
];
scanf( ;i<=n;i++) {
a[i]=read();
}
build(,n,);
;i<=m;i++) {
scanf( ]== ls=read(); rs=read(); val=read();
,n,,ls,rs,val);
printf( }
ls=read(); val=read();
Update(,n,,ls,val);
a[ls]=val;
}
}
;
}
HUST 1407(数据结构)的更多相关文章
- 基础数据结构之(Binary Trees)
从头开始刷ACM,真的发现过去的很多漏洞,特别越是基础的数据结构,越应该学习得精,无论是ACM竞赛,研究生考试,还是工程上,对这些基础数据结构的应用都非常多,深刻理解非常必要.不得不说最近感触还是比较 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 深入浅出Redis-redis底层数据结构(上)
1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...
- 算法与数据结构(十五) 归并排序(Swift 3.0版)
上篇博客我们主要聊了堆排序的相关内容,本篇博客,我们就来聊一下归并排序的相关内容.归并排序主要用了分治法的思想,在归并排序中,将我们需要排序的数组进行拆分,将其拆分的足够小.当拆分的数组中只有一个元素 ...
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找
今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...
- 算法与数据结构(八) AOV网的关键路径
上篇博客我们介绍了AOV网的拓扑序列,请参考<数据结构(七) AOV网的拓扑排序(Swift面向对象版)>.拓扑序列中包括项目的每个结点,沿着拓扑序列将项目进行下去是肯定可以将项目完成的, ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
随机推荐
- Matlab调用C程序 分类: Matlab c/c++ 2015-01-06 19:18 464人阅读 评论(0) 收藏
Matlab是矩阵语言,如果运算可以用矩阵实现,其运算速度非常快.但若运算中涉及到大量循环,Matlab的速度令人难以忍受的.当必须使用for循环且找不到对应的矩阵运算来等效时,可以将耗时长的函数用C ...
- linux安装glassfish并布署
1 https://glassfish.java.net/download.html 2 准备工作:需要jdk7以上版本 Java EE 7 requires JDK 7 (or above) 下载g ...
- Android IJKPlayer缓冲区设置以及播放一段时间出错解决方案
IJKPlayer拖动播放进度会导致重新请求数据,未使用已经缓冲好的数据,所以应该尽量控制缓冲区大小,减少不必要的数据损失. mMediaPlayer.setOption(IjkMediaPlayer ...
- 最实用解决tomcat startup.bat 一闪而过
1.直接到tomcat 的解压路径中找到log日志,eg:D:\tomcat\apache-tomcat-7.0.73\logs 查看 catalina 这个日志文件,可以清除的定位错误原因:一般可能 ...
- VMware虚拟机下载与安装
VMware下载与安装 一.虚拟机的下载 1.进入VMware官网,点击左侧导航栏中的下载,再点击图中标记的Workstation Pro,如下图所示. 2.根据操作系统选择合适的产品,在这里以Win ...
- vscode显示php函数列表
1.安装插件支持 https://marketplace.visualstudio.com/items?itemName=linyang95.php-symbols 2.ctrt+shift+o 即可 ...
- 微信小程序---账号注册与开发工具
(1)申请帐号 进入小程序注册页 根据指引填写信息和提交相应的资料,就可以拥有自己的小程序帐号. 在这个小程序管理平台,你可以管理你的小程序的权限,查看数据报表,发布小程序等操作. 登录 小程序后台 ...
- delphi byte to of set
最佳方案 type // Controls.TCMMouseWheel relies on TShiftState not exceeding 2 bytes in size TShiftState ...
- 根据数据库表自动生成实体类、xml和dao---mybatis
网盘链接: https://pan.baidu.com/s/1AVGz0bDa_Y5zjk7vXa2eHw 提取码: 2gr6 1.记事本打开generatorConfig.xml文件 2(1,2,3 ...
- 常量指针(pointer to constant)和指针常量(constant pointer)
一个指针可以操作两个实体,一个是指针值(即地址),一个是间访值(即指向的实体).于是指针的常量性也分为两种:常量指针(pointer to constant)和指针常量(constant pointe ...