题目链接

这题我很久之前用分块写过,没写出来。。

今天又看到了,于是下决心把这题做出来。

这次我用线段树写的,直接对每本书的编号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(线段树)的更多相关文章

  1. 洛谷P2464 [SDOI2008] 郁闷的小j [分块]

    题目传送门 郁闷的小j 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也 ...

  2. 2018.09.26 洛谷P2464 [SDOI2008]郁闷的小J(map+vector)

    传送门 本来出题人出出来想考数据结构的. 但是我们拥有map+vector/set这样优秀的STL,因此直接用map离散化,vector存下标在里面二分找答案就行了. 代码: #include< ...

  3. 洛谷P2464 [SDOJ2008]郁闷的小J

    洛谷P2464 [SDOJ2008]郁闷的小J 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他 ...

  4. P2464 [SDOI2008]郁闷的小J

    题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危险,这也正是他所郁闷的. 具体说 ...

  5. [SDOI2008]郁闷的小J(分块)

    [SDOI2008]郁闷的小J 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的危 ...

  6. fhqtreap - Luogu 2464 [SDOI2008]郁闷的小J

    [SDOI2008]郁闷的小JJ 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他面临着被解雇的 ...

  7. 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 ...

  8. 【洛谷4219】[BJOI2014]大融合(线段树分治)

    题目: 洛谷4219 分析: 很明显,查询的是删掉某条边后两端点所在连通块大小的乘积. 有加边和删边,想到LCT.但是我不会用LCT查连通块大小啊.果断弃了 有加边和删边,还跟连通性有关,于是开始yy ...

  9. 洛谷P2982 [USACO10FEB]慢下来Slowing down(线段树 DFS序 区间增减 单点查询)

    To 洛谷.2982 慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) cows con ...

  10. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

随机推荐

  1. 虚拟现实-VR-UE4-编辑自定义Character-上下左右移动-旋转

    在上一片文章中,我创建了一个自定义的Character,但是只是有一行log显示,我使用了自己的Character,不能有任何操作,这里,我将记录我修改我的Character的过程 万事第一步,打开工 ...

  2. 常用模块(chardet)

    作用:检测二进制的编码格式,不是百分百正确 import chardet f = open('test.txt', 'rb')data = f.read()print(data)result = ch ...

  3. CSS3 : box-shadow

    box-shadow 用于设置边框阴影,语法: box-shadow: h-shadow v-shadow blur spread color inset; -moz-box-shadow: h-sh ...

  4. 杜绝网上压根没测过就乱写之 《oracle mybatis 返回自增主键 》

    面试过好多人,包括自己也属于这么一个情况: 遇到问题直接去网上查,一般都可以查到解决方案.其中也包括一些基本的面试资料的答案. 其实有很多答案也都是正确的,但是还是存在一些压根就是胡乱抄来的答案,也不 ...

  5. 条件随机场CRF

    条件随机场(CRF)是给定一组输入随机变量X的条件下另一组输出随机变量Y的条件概率分布模型,其特点是假设输出随机变量构成马尔科夫随机场.实际上是定义在时序数据上的对数线性模型.条件随机场属于判别模型. ...

  6. Week 1 Team Homework #3 from Z.XML-软件工程在北航

    任务名称:软件工程在北航 任务要求:要求我们采访往届师兄师姐,收集他们对于软件工程这门课程的反馈.具体作业链接http://www.cnblogs.com/jiel/p/3311403.html 任务 ...

  7. tar 加密压缩和解密解压

    加密压缩 tar -czvf - file | openssl des3 -salt -k password -out /path/to/file.tar.gz 解密解压 openssl des3 - ...

  8. 个人作业Week3-案例分析(201521123103 吴雅娟)

    根据博客要求,写一篇个人随笔 参考来自: http://www.cnblogs.com/xinz/archive/2012/03/26/2417699.html: http://www.cnblogs ...

  9. Jboss6内存修改

    1.启动脚本:/home/jboss/jboss-eap-6.2/bin/standalone.sh -Djboss.bind.address.management=192.168.0.62 -Djb ...

  10. 《SQL入门经典》总结

    <SQL入门经典>这本书从考试前就开了个头,一直到前两天才看完,拉的战线也够长的.放假来了,基本上什么内容都不记得了.好不容易看完了,就赶紧总结一下吧! 该书分为两大部分,第一部分是第1~ ...