题目链接:http://acdream.info/problem?pid=1157

Problem Description

由3钟类型操作:
1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]
2)C i (1-base) 删除第i条增加的线段,保证每条插入线段最多插入一次,且这次删除操作一定合法
3) Q L R(1 <= L <= R <= 1000000000) 查询目前存在的线段中有多少条线段完全包含[L,R]这个线段,线段X被线段Y完全包含即LY <= LX

<= RX <= RY)
给出N,接下来N行,每行是3种类型之一

Input

多组数据,每组数据N

接下来N行,每行是三种操作之一(1 <= N  <= 10^5)

Output

对于每个Q操作,输出一行,答案
 
题目大意:略。
思路:传说这个就叫做CDQ分治,我也不确定是不是。对每一段[l..r],分治处理[l, mid]和[mid + 1..r]。对于[l..r],处理[l..mid]中的线段对[mid + 1..r]的影响,用树状数组处理一下就可以了。
 
代码(1608MS):
 #include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std; const int MAXN = ; int hashmap[MAXN], hcnt;
int tree[MAXN]; int hash(int x) {
return lower_bound(hashmap, hashmap + hcnt, x) - hashmap + ;
} inline int lowbit(int x) {
return x & -x;
} void modify(int k, int val) {
while(k <= hcnt) {
tree[k] += val;
k += lowbit(k);
}
} int get_sum(int k) {
int res = ;
while(k) {
res += tree[k];
k -= lowbit(k);
}
return res;
} struct Node {
int v, l, r, id;
Node() {}
Node(int v, int l, int r, int id): v(v), l(l), r(r), id(id) {}
bool operator < (const Node &rhs) const {
if(r != rhs.r) return r > rhs.r;
if(l != rhs.l) return l < rhs.l;
return (v == ) < (rhs.v == );
}
}; bool cmp_id(const Node &a, const Node &b) {
return a.id < b.id;
} Node p[MAXN];
int ans[MAXN], tl[MAXN], tr[MAXN];
int n; void solve(int l, int r) {
if(l == r) return ;
int mid = (l + r) >> ;
solve(l, mid);
solve(mid + , r);
sort(p + l, p + r + );
for(int i = l; i <= r; ++i) {
if(p[i].id <= mid) {
if(p[i].v) modify(p[i].l, p[i].v);
} else {
if(!p[i].v) ans[p[i].id] += get_sum(p[i].l);
}
}
for(int i = l; i <= r; ++i) {
if(p[i].id <= mid && p[i].v) modify(p[i].l, -p[i].v);
}
sort(p + l, p + r + , cmp_id);
} int main() {
while(scanf("%d", &n) != EOF) {
int tcnt = ; hcnt = ;
char c;
for(int i = , t, u; i <= n; ++i) {
scanf(" %c", &c);
if(c == 'D') {
scanf("%d%d", &t, &u);
p[i] = Node(, t, u, i);
hashmap[hcnt++] = t; hashmap[hcnt++] = u;
tl[++tcnt] = t; tr[tcnt] = u;
}
if(c == 'C') {
scanf("%d", &t);
p[i] = Node(-, tl[t], tr[t], i);
}
if(c == 'Q') {
scanf("%d%d", &t, &u);
p[i] = Node(, t, u, i);
hashmap[hcnt++] = t; hashmap[hcnt++] = u;
}
}
sort(hashmap, hashmap + hcnt);
hcnt = unique(hashmap, hashmap + hcnt) - hashmap;
for(int i = ; i <= n; ++i) {
p[i].l = hash(p[i].l); p[i].r = hash(p[i].r);
}
memset(ans + , , n * sizeof(int));
solve(, n);
for(int i = ; i <= n; ++i)
if(p[i].v == ) printf("%d\n", ans[i]);
}
}

ACdream 1157 Segments(CDQ分治)的更多相关文章

  1. ACdream 1157 Segments CDQ分治

    题目链接:https://vjudge.net/problem/ACdream-1157 题意: Problem Description 由3钟类型操作: 1)D L R(1 <= L < ...

  2. 【ACdream】1157 Segments cdq分治

    Segments   Problem Description 由3钟类型操作:1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]2)C i ...

  3. ACdream 1157 (cdq分治)

    题目链接 Segments Time Limit: 4000/2000MS (Java/Others)Memory Limit: 20000/10000KB (Java/Others) Problem ...

  4. ACdream 1157 Segments

    Segments Time Limit: 2000ms Memory Limit: 10000KB This problem will be judged on ACdream. Original I ...

  5. ACdream1157 Segments(CDQ分治 + 线段树)

    题目这么说的: 进行如下3种类型操作:1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]2)C i (1-base) 删除第i条增加的线段, ...

  6. 【教程】简易CDQ分治教程&学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  7. BZOJ 2683 简单题 ——CDQ分治

    [题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...

  8. HDU5618 & CDQ分治

    Description: 三维数点 Solution: 第一道cdq分治...感觉还是很显然的虽然题目不能再傻逼了... Code: /*=============================== ...

  9. 初识CDQ分治

    [BZOJ 1176:单点修改,查询子矩阵和]: 1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 200 ...

随机推荐

  1. fatal error C1854: 无法覆盖在创建对象文件.obj”的预编译头过程中形成的信息

    原因: 将stdafx.cpp 的预编译头属性  由 创建预编译头(/Yc) 改成了 使用预编译头(/Yu) 解决: 改回为 创建预编译头(/Yc) 参考文档 http://blog.csdn.net ...

  2. Mac OS X 上启动 FTP/SFTP server,并设置 log level

    木易小伟的博客| 木易小伟的博客 2013-08-13 5708 阅读 FTP Log SFTP Mac OS 系统配置 1. 启动FTP Server: 命令行下,  sudo -s launch ...

  3. Android 代码中文字在手机上显示乱码问题解决方法

    在学习Android过程中,用于测试时发现,代码中的中文在真机上会显示乱码, 网上查阅了些资料,参考如下: http://www.androidchina.net/3024.html http://b ...

  4. Linux最常用命令及快捷键整理

    最近在学Linux系统命令,在阿里云买了一台linux服务器.为方便自己也方便他人,整理了Linux常用命令及快捷键. 用命令: 文件和目录: # cd /home                   ...

  5. MongoDB非正常关闭后修复记录

    启动mongodb时出现如下错误: 根据提示可以知道错误原因是mongodb非正常关闭,此时需要对数据库进行修复.修复命令:mongod --repair 或 ./mongod --repair , ...

  6. Java冒泡排序,Java对象冒泡排序

    今天呆公司特别无聊,百度了一下Java机试题,看到一个冒泡排序. 粘上我全部的代码: 实体类: package accp.com.internet;/** * 人物类 * @author xuxiao ...

  7. 使用sql语句查询日期在一定时间内的数据

    使用sql语句查询日期在一周内的数据 select * from ShopOrder where datediff(week,ordTime,getdate()-1)=0   //查询当天日期在一周年 ...

  8. 获取dom元素的宽度和高度

    一.获取css的大小 1.第一种通过内联样式 var box = document.getElementById('box'); var w = box.style.width; var h = bo ...

  9. JQuery:JQuery设置HTML

    JQuery:设置HTML1.Query - 设置内容和属性设置内容 - text().html() 以及 val()我们将使用前一章中的三个相同的方法来设置内容: text() - 设置或返回所选元 ...

  10. 百度SEO建议

    SEO(Search Engine Optimization)汉译为搜索引擎优化.seo优化是专门利用搜索引擎的搜索规则来提高目前网站在有关搜索引擎内的自然排名的方式.SEO的目的理解是为网站提供生态 ...