【洛谷 P2464】[SDOI2008]郁闷的小J(线段树)
题目链接
这题我很久之前用分块写过,没写出来。。
今天又看到了,于是下决心把这题做出来。
这次我用线段树写的,直接对每本书的编号Hash一下然后离散化然后各建一棵线段树,维护当前编号在某个位置有没有书,就行了。
为了卡空间,我用了\(vector\),同时指针建树,结构体里不保存当前节点维护的区间,区间作为参数递归,这样就能过了,空间复杂度应该是\(O(N+M\ log\ N)\)。
另外Hash的边界搞大一点,第一次只弄了10W 80分,改成100W就A了。
#include <iostream>
#include <cstdio>
#include <vector>
#define re register
using namespace std;
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9') { if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar(); }
return s * w;
}
const int MAXN = 100010;
int num;
struct Seg_Tree{
int sum;
Seg_Tree *l, *r;
Seg_Tree() { l = NULL; r = NULL; sum = 0; }
void pushup(){
sum = 0;
if(l != NULL) sum += l->sum;
if(r != NULL) sum += r->sum;
}
void Add(int c, int p, int L, int R){
if(L == R){
sum += c;
return;
}
int mid = (L + R) >> 1;
if(p > mid){
if(r == NULL)
r = new Seg_Tree;
r->Add(c, p, mid + 1, R);
}
else{
if(l == NULL)
l = new Seg_Tree;
l->Add(c, p, L, mid);
}
pushup();
}
int Ask(int L, int R, int wl, int wr){
int ans = 0;
if(L >= wl && R <= wr) return sum;
if(L > wr || R < wl) return 0;
int mid = (L + R) >> 1;
if(l != NULL) ans += l->Ask(L, mid, wl, wr);
if(r != NULL) ans += r->Ask(mid + 1, R, wl, wr);
return ans;
}
};
vector <Seg_Tree> tree;
int n, m, v[MAXN * 10], id[MAXN * 10];
int getHash(int x){
int hash = x % 1000000;
if(!v[hash]) v[hash] = x;
else while(v[hash] != x && v[hash]) hash = (hash + 233) % 10000;
return hash;
}
int a, b, c;
int w[MAXN];
char ch;
int main(){
tree.push_back(Seg_Tree());
n = read(); m = read();
for(re int i = 1; i <= n; ++i){
w[i] = read();
re int hash = getHash(w[i]);
if(!id[hash]) id[hash] = ++num, tree.push_back(Seg_Tree());
tree[id[hash]].Add(1, i, 1, n);
}
for(re int i = 1; i <= m; ++i){
do{
ch = getchar();
}while(ch != 'C' && ch != 'Q');
if(ch == 'C'){
a = read(); b = read();
re int hash = getHash(w[a]);
tree[id[hash]].Add(-1, a, 1, n);
hash = getHash(b);
if(!id[hash]) id[hash] = ++num, tree.push_back(Seg_Tree());
tree[id[hash]].Add(1, a, 1, n);
w[a] = b;
}
else{
a = read(); b = read(); c = read();
re int hash = getHash(c);
if(!id[hash]) id[hash] = ++num, tree.push_back(Seg_Tree());
printf("%d\n", tree[id[hash]].Ask(1, n, a, b));
}
}
return 0;
}
【洛谷 P2464】[SDOI2008]郁闷的小J(线段树)的更多相关文章
- 洛谷P2464 [SDOI2008] 郁闷的小j [分块]
题目传送门 郁闷的小j 题目描述 小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是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的 ...
- HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【洛谷4219】[BJOI2014]大融合(线段树分治)
题目: 洛谷4219 分析: 很明显,查询的是删掉某条边后两端点所在连通块大小的乘积. 有加边和删边,想到LCT.但是我不会用LCT查连通块大小啊.果断弃了 有加边和删边,还跟连通性有关,于是开始yy ...
- 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)
To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
随机推荐
- Android当代码方法超过65536个时,在2.3机器上会不能安装,出现INSTALL_FAILED_DEXOPT错误
今天打包时,发现2.3机器,产生的APK在某些机器上不能安装(Installation error: INSTALL_FAILED_DEXOPT),针对这个问题的一个可能解释是:最新的ADT和SDK ...
- Linux-Shell脚本编程-学习-3-Shell编程-shell脚本基本格式
前面两篇文章基本介绍了一部分linux下的基本命令,后面还需要大家自行了解下linux的文件系统的磁盘管理部分,这里就不在写了. 什么是shell编程,我也解释不来,什么是shell脚本了,我理解就是 ...
- gcc options选项的优化及选择
gcc options选项的优化 -c和-o都是gcc编译器的可选参数[options] -c表示只编译(compile)源文件但不链接,会把.c或.cc的c源程序编译成目标文件,一般是.o文件.[只 ...
- 一个简单的ipfs音乐播放器的实现
IPFS音乐播放器 IPFS相关 IPFS第一次亲密接触 什么是IPFS IPFS对比HTTP/FTP等协议的优势 IPFS应用场景 -移动数据 交易 路由 网络 定义数据 命名 使用数据 具体场景; ...
- restFul介绍及其使用规范
什么是REST和RESTful API? REST:(英文:Representational State Transfer,简称REST)表征性状态转移,是一种软件架构风格. RESTful : RE ...
- uva 11526 H(n) (数论)
转载自 http://blog.csdn.net/synapse7/article/details/12873437 这道题我自己做的时候没有想到好的优化方法,提交的时候借鉴这篇文章的内容,转载如下: ...
- WebStorm中配置ExtJS
原文链接:http://zhidao.baidu.com/link?url=yX0wDWrL-b2P8k3JNNI38Fb6keuAgm0j9E-QBL1KfWXrZgLZ88grAOVJvat6dJ ...
- eclipse安装问题
eclipse安装之前需要安装JDK. 注意:eclipse和JDK需要一致,如都是64位或者都是32位. 不然会报错.
- document.querySelector()和document.querySelectorAll()
HTML5向Web API新引入了 document.querySelector()和document.querySelectorAll()两个方法,都可以接收三种类型的参数:id(#),class( ...
- SQL SERVER 实用命令集锦
1.根据关键字查询库中的存储过程,返回符合条件的存储过程名称 select distinct object_name(id) from syscomments where id in (select ...