Segments

 

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操作,输出一行,答案

Sample Input

6
D 1 100
D 3 8
D 4 10
Q 3 8
C 1
Q 3 8

Sample Output

2
1

Hint

注意,删除第i条增加的线段,不是说第i行,而是说第i次增加。

比如

D 1 10

Q 1 10

D 2 3

D 3 4

Q 5 6

D 5 6

C 2是删除D 2 3

C 4是删除D 5 6

Source

dream

Manager

 
题解:

CDQ分治流程如下:

1.将整个操作序列分为两个长度相等的部分(分)

2.递归处理前一部分的子问题(治1)

3.计算前一部分的子问题中的修改操作对后一部分子问题的影响(治2)

4.递归处理后一部分子问题(治3)

cdq入门练习当中

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define pii pair<int,int>
#define MP make_pair
typedef long long LL;
const long long INF = 1e18+1LL;
const double pi = acos(-1.0);
const int N = 5e5+, M = 1e3+,inf = 2e9; int L[N],R[N],ans[N];
struct ss{
int l,r,t,qid,type;
ss(){}
ss(int a,int b,int c,int d,int e) : l(a),r(b),t(c),qid(d),type(e){}
bool operator < (const ss &j) const {
if(l==j.l)
return t < j.t;
else return l < j.l;
}
}a[N],t[N];
int C[N];int san[N],n;
void add(int x,int c) {
for(int i = x; i <= *n; i += i&(-i)) {
C[i] += c;
}
}
int sum(int x) {
int ret = ;
for(int i = x; i; i -= i&(-i)) ret += C[i];
return ret;
}
void cdq(int ll,int rr) {
if(ll == rr) return ;
//cout<<ll<<" "<<rr<<endl;
for(int i = ll; i <= rr; ++i) {
if(a[i].t <= mid && a[i].type!=) add(a[i].r,a[i].type);
else if(a[i].t > mid && a[i].type==) {
ans[a[i].qid] += sum(*n)-sum(a[i].r-);
} }
for(int i = ll; i <= rr; ++i) {
if(a[i].t <= mid && a[i].type!=) {
add(a[i].r,-a[i].type);
}
}
int L1 = ll, R1 = mid+;
for(int i = ll; i <= rr; ++i) {
if(a[i].t <= mid) t[L1++] = a[i];
else t[R1++] = a[i];
}
for(int i = ll; i <= rr; ++i) a[i] = t[i]; cdq(ll,mid),cdq(mid+,rr);
}
char ch[];
int x,y;
int main() {
while(scanf("%d",&n)!=EOF) {
scanf("%d",&n);
for(int i = ; i <= *n; ++i) C[i] = ;
int cnt = ;
int qcnt = ;int scnt = ;
for(int i = ; i <= n; ++i) {
scanf("%s",ch);
if(ch[] == 'D') {
scanf("%d%d",&x,&y);
L[++cnt] = x;
R[cnt] = y;
san[++scnt] = x;
san[++scnt] = y;
a[i] = ss(x,y,i,,);
}
else if(ch[] == 'C') {
scanf("%d",&x);
a[i] = ss(L[x],R[x],i,,-);
}
else if(ch[] == 'Q') {
scanf("%d%d",&x,&y);
san[++scnt] = x;
san[++scnt] = y;
a[i] = ss(x,y,i,++qcnt,);
}
}
sort(san+,san+scnt+);
int SC = unique(san+,san++scnt) - san - ;
for(int i = ; i <= n; ++i) {
a[i].l = lower_bound(san+,san+SC+,a[i].l) - san;
a[i].r = lower_bound(san+,san+SC+,a[i].r) - san;
}
sort(a+,a+n+);
for(int i = ; i <= qcnt; ++i) ans[i] = ;
cdq(,n);
for(int i = ; i <= qcnt; ++i) printf("%d\n",ans[i]);
} return ;
}

【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 (cdq分治)

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

  3. ACdream 1157 Segments(CDQ分治)

    题目链接:http://acdream.info/problem?pid=1157 Problem Description 由3钟类型操作:1)D L R(1 <= L <= R < ...

  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. 【JavaScript 2—基础知识点】:数据类型

    导读:我发现不管是哪一门语言,都会先介绍其发展,语法规则,数据类型,流程控制等.那么,这次,就介绍一下JavaScript中的数据类型,有些看着眼熟,有些不熟.熟的也不是之前认识的,不熟的,也不见得就 ...

  2. 【C#】最后总结

    导读:要想收获,就逃不开总结.一直拖着拖着,再也无法忍受了.应该说是又学习迷茫了,所以,我要总结.一直都觉得自己总结不出来,或者是看了别人的优秀总结,心里就打鼓,不敢下笔.现在,化用一下:但热闹是他们 ...

  3. 九度oj 题目1153:括号匹配问题

    题目描述: 在某个字符串(长度不超过100)中有左括号.右括号和大小写字母:规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配.写一个程序,找到无法匹配的左括号和右括 ...

  4. [luoguP3172] [CQOI2015]选数(递推+容斥原理)

    传送门 不会莫比乌斯反演,不会递推. 但是我会看题解. 先将区间[L,H]变成(L-1,H],这样方便处理 然后求这个区间内gcd为k的方案数 就是求区间((L-1)/k,H/k]中gcd为1的方案数 ...

  5. 算法复习——虚树(消耗战bzoj2286)

    题目: Description 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战 ...

  6. 刷题总结——road(ssoi)

    题目: 题目背景 SOURCE:NOIP2016-RZZ-1 题目描述 有 N 个城市,这些城市通过 M 条无向边互相连通,每条边有一个权值 Ci ,表示这条边的长度为 2^(Ci) ,没有两条边的长 ...

  7. Spoj-BLMIRINA Archery Training

    Mirana is an archer with superpower. Every arrow she shoots will get stronger the further it travels ...

  8. calc BZOJ 2655

    calc [问题描述] 一个序列a1,...,an是合法的,当且仅当: 长度为给定的n. a1,...,an都是[1,A]中的整数. a1,...,an互不相等. 一个序列的值定义为它里面所有数的乘积 ...

  9. js Math [ 随机数、绝对值、四舍五入、进一取整、舍去取整、最大值、最小值、圆周率 ]

    <script> /* 数学对象:Math */ with (document) { write('<br>-3.5的绝对值:'+Math.abs(-3.5)); write( ...

  10. IntelliJ IDEA设置properties文件显示中文

    配置这里: 注意:上面是Default Settings,还需要在Settings中设置成上面一样的.