陈丹琦分治~~~其实一些数据小的时候可以用二维或者多维树状数组做的,而数据大的时候就无力的题目,都可以用陈丹琦分治解决。

题目:由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种类型之一

由于 L R 比较大,直接是不行的,于是我们可以利用CDQ分治把二维变成一维,然后离散化。树状数组查询。

对于询问 L R 只需要 知道 小于等于L 且大于等于R的有多少个就可以了。这里我是把线段左端点进行CDQ分治,然后每次查询大于R数目。

 #include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5+;
struct Node
{
int idx,l,r,delt;
int kind;
bool operator < (const Node &rhs)const
{
return l < rhs.l ;
}
}node[maxn];
int ans[maxn],del[maxn];
//-------------BIT--------- //此处树状数组反向写的,用于查询 大于等于x的数有多少个
inline int lowbit (int x)
{
return x & -x;
}
int arr[maxn],MAX;
void add (int x,int d)
{
while (x)
{
arr[x] += d;
x -= lowbit(x);
}
}
int sum(int x)
{
int ans = ;
while (x <= MAX)
{
ans += arr[x];
x += lowbit(x);
}
return ans;
}
//--------------离散化-----
int vec[maxn],vec_idx;
int hash_(int x)
{
return lower_bound(vec,vec+vec_idx,x) - vec + ;
}
//------------------------
void CDQ(int l,int r)
{
if (l == r)
return;
int mid = (l + r) >> ;
CDQ(l,mid);
CDQ(mid+,r);
int j = l;
for (int i = mid+; i <= r; i++)
{
if (node[i].kind == )
{
for ( ;j <= mid && node[j].l <= node[i].l; j++)
{
if (node[j].kind == )
{
add(hash_(node[j].r),node[j].delt);
}
}
ans[node[i].idx] += sum(hash_(node[i].r));
}
}
for (int i = l; i < j; i++)
if ( node[i].kind == )
add(hash_(node[i].r),-node[i].delt);
inplace_merge(node+l,node+mid+,node+r+);
}
int vis[maxn];
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int n;
while (~scanf ("%d",&n))
{
int cnt = ;
vec_idx = ;
memset(arr,,sizeof(arr));
memset(ans,,sizeof(ans));
memset(vis,,sizeof(vis));
vector<int>vv;
for (int i = ; i <= n; i++)
{
char op[];
scanf ("%s",op);
if (op[] == 'D')
{
scanf ("%d%d",&node[i].l,&node[i].r);
node[i].kind = ;
node[i].idx = i;
node[i].delt = ;
vec[vec_idx++] = node[i].r;
vv.push_back(i);
}
if (op[] == 'Q')
{
scanf ("%d%d",&node[i].l,&node[i].r);
node[i].kind = ;
node[i].idx = i;
vec[vec_idx++] = node[i].r;
vis[i] = ;
}
if (op[] == 'C')
{
int tmp;
scanf ("%d",&tmp);
node[i].kind = ;
node[i].l = node[vv[tmp-]].l;
node[i].r = node[vv[tmp-]].r;
node[i].delt = -; // 对于删除的边类型与增加的相同但是,操作的时候是-1
node[i].idx = i;
}
}
sort(vec,vec+vec_idx);
vec_idx = unique(vec,vec+vec_idx) - vec;
MAX = vec_idx + ;
CDQ(,n);
for (int i = ; i <= n; i++)
{
if (vis[i])
printf("%d\n",ans[i]);
}
}
return ;
}

Acdream1157---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. ACdream1157 Segments(CDQ分治 + 线段树)

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

  4. ACdream 1157 Segments(CDQ分治)

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

  5. ACdream 1157 (cdq分治)

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

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

  10. HDU5322 Hope(DP + CDQ分治 + NTT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5322 Description Hope is a good thing, which can ...

随机推荐

  1. Atitit.Gui控件and面板----数据库区-mssql 2008 权限 配置 报表查看成员

    Atitit.Gui控件and面板----数据库区-mssql 2008 权限 配置 报表查看成员 1. 配置server连接权限 1 2. 配置数据库权限 1 3. 设置表格/视图安全性 2 1.  ...

  2. html表格合并(行,一排)

    <table> <tr> <td colspan="2">失败的例子:</td> </tr> {% for ip , j ...

  3. Spring-----1、Spring一个简短的引论

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  4. MyEclipse Web Project导入Eclipse Dynamic Web Project,无法部署到tomcat问 题

    做作业遇到一个小问题,将MyEclipse Web Project导入到Eclipse中开发.在部署到tomcat时,发现无法发布这个项目. 问题分析: MyEclipse Web Project被识 ...

  5. IKAnalyzer原理分析

    IKAnalyzer原理分析 IKAnalyzer自带的 void org.wltea.analyzer.dic.Dictionary.disableWords(Collection<Strin ...

  6. iOS 网络与多线程--6.下载并保存网络图片

    使用二进制数据对象的,从制定网站获取数据的方法,下载网络图片,并转化为二进制数据,然后将二进制数据保存到磁盘 按照注释需要进行阅读以下代码 // Created by JinXin on 15/12/ ...

  7. Php 基本语法

    php基本语法 1. 四种不同的开始结束标记 只有<?php ?>.<script language="php"></script>两个总是可用 ...

  8. poj2236 基础并查集

    题目链接:http://poj.org/problem?id=2236 题目大意:城市网络由n台电脑组成,因地震全部瘫痪,现在进行修复,规定距离小于等于d的电脑修复之后是可以直接相连 进行若干操作,O ...

  9. mysql 5.5 升级到 mysql 5.6

    目前MySQL数据库软件升级到5..26版本,主要有两种方法.一种是停机升级,即在现有环境下先停止数据库,然后升级数据库软件版本和数据库版本:另外一种是采用不停机的主从升级(master--slave ...

  10. Rand

    我看了下网上,是这样的:rand()随机产生一个数(0-65535),加上%后,就是对其它数求余,求余产生的数取决于求余的数.比如,rand()%20;意思是利用rand()的返回值(一个0-6553 ...