题目链接: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. 如何将cmd中命令输出保存为TXT文本文件

    在使用Windows 中的cmd.exe工具时,有时候我们想要把我们的输入命令及结果保存起来, 但是用复制的方法过于麻烦:有时输出数据条数过大,会造成内容自动滚出屏幕,无法阅读,我们可将命令运行的结果 ...

  2. oracle 表查询二

    1.使用逻辑操作符号问题:查询工资高于500或者是岗位为manager的雇员,同时还要满足他们的姓名首字母为大写的J?select * from emp where (sal > 500 or ...

  3. [LeetCode]题解(python):088 Merge Sorted Array

    题目来源 https://leetcode.com/problems/merge-sorted-array/ Given two sorted integer arrays nums1 and num ...

  4. Fiddler-001-抓包工具初识

    Fiddler 是一个非常简单的网络调试器,也是目前最常用的http抓包工具之一 .通过 Fiddler,我们能够能够记录客户端和服务器之间的所有 HTTP请求,即记录并检查所有你的电脑和互联网之间的 ...

  5. Selenium2学习-009-WebUI自动化实战实例-007-Selenium 8种元素定位实战实例源代码(百度首页搜索录入框及登录链接)

    此 文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,通过 ID.name.xpath.cssSelector.linkText.className.partialLinkTe ...

  6. ASP.NET中application对象的用法

    一.Application对象的理解 Application对象在实际网络开发中的用途就是记录整个网络的信息,如上线人数.在线名单.意见调查和网上选举等.在给定的应用程序的多有用户之间共享信息,并在服 ...

  7. 给Windows机器创建软连接

    给Windows机器创建软连接 http://blog.csdn.net/w6611415/article/details/32084677

  8. 浅谈 man 命令的日常使用

    Linux系统提供了相对比较丰富的帮助手册(man),man是manual的缩写,在日常linux系统管理中经常用到,今天就简单聊聊man.man 本身也提供自己的帮助手册,通过man就可以查看. ( ...

  9. Linux 中的零拷贝技术,第 1 部分

    概述 本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景.本文是本系列文章的第一部分,主要是介绍一些零拷贝技术的相关 ...

  10. android中actionbar的title居中

    1.配置 activity的主题: android:theme="@style/AppThemeBB" 2. 通过Menu.xml文件布局 添加菜单item menu/menu.x ...