【洛谷 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 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
随机推荐
- LinqToExcel使用简介一
最近才看到原来也可以用Linq来访问Excel,功能还挺强大的.要使用这个功能,首先得下载一个LinqToExcel的相关文件,然后就可以调用相关的方法. 使用前面介 ...
- 我的阿里之路+Java面经考点
我的阿里之路+Java面经考点 时间:2018-03-19 23:03 来源:未知 作者:admin 点击:87次 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三 ...
- 30分钟快速搭建Web CRUD的管理平台--django神奇魔法
加上你的准备的时间,估计30分钟完全够用了,因为最近在做爬虫管理平台,想着快速开发,没想到python web平台下有这么非常方便的框架,简洁而优雅.将自己的一些坑总结出来,方便给大家的使用. 准备环 ...
- Nullable可空类型
一个Nullable类型就是基本类型加上一个"是否为null指示器"的合成类型.对于一个类型,如果既可以给他分配一个值,也可以给它分配null引用,我们就说这个类型是可空的. 可空 ...
- Java 集合学习--集合概述
一.集合框架 集合,通常也叫容器,java中有多种方式保存对象,集合是java保存对象(对象的引用)的方式之一,之前学习的数组是保存对象的最有效的方式,但是数组却存在一个缺陷,数组的大小是固定的,但是 ...
- 在阿里云上遇见更好的Oracle(二)
从上一篇文章的反馈来看,大家还是喜欢八卦多过技术细节,那这一篇继续一些题外话,说说我对“去IOE”的看法. 对同一件事情,参与的没参与的人,讨论起来,都会有各自的立场.所以这里先申明一下,以下内容只是 ...
- Dijkstra标准模板
Dijkstra求最短路问题:单元求最短路,从任意点出发求得该点到达其他任意点的距离 Dijkstra其实是一种贪心策略,与出发点(即源点)所连接的点中找到距离最短的点(这个距离是源点到这个点的最短距 ...
- 自定义Json格式
老铁们都知道,一般的json格式就是键值对格式,在一些特定的框架或者系统中,会用到自定义格式的json文件,假设我们要得到的特定格式json格式如下: {"A":"2&q ...
- 使用window.getSelection()获取div中选中文字内容及位置
div添加一个弹出事件: $(document).ready(function () { $("#marked-area").mouseup(function (e) { $sco ...
- C#中转义符
C#转义字符: 一种特殊的字符常量:以反斜线"\"开头,后跟一个或几个字符.具有特定的含义,不同于字符原有的意义,故称“转义”字符.主要用来表示那些用一般字符不便于表示的控制代码. ...