题目传送门

题解:现在需要维护的每次的询问矩形和前面插入的所有矩形有公共部分的个数。 我们试着直接去维护这个东西, 发现可能的情况太多,不好维护,所以我们维护每次询问的时候在当前矩阵个数下,有多少个矩阵是一定在外面的。对于一个矩阵来说, 我们只需要统计到目前位置, 多少个矩形的下底线 在询问矩形的上底线之上, 这样我们就减去了在询问矩形上方的不重合矩形。 然后我们对矩形的左右下也一样维护这个信息。对于这个操作我们可以用4个树状数组直接去维护这个信息。每个数状数组记录一下每条底线出现的位置。

维护完这个东西之后,我们发现如果一个矩形在询问矩形的左上方, 他会被减去2次,这样就多减了, 我们需要把左上角的矩形个数再加回去。 我们需要 对每个询问矩形来说, 维护出有多少个插入矩形的右下角的端点是在询问矩形的左上角的端点的左上角, 对于这个问题就变成了一个2维偏序问题,我们用cdq去维护这个信息。当然还有其他3个角落,我们也需要对那些角度做一样的操作。最后我们就可以得到答案了。

代码:

 #include<bits/stdc++.h>
using namespace std;
#define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
#define LL long long
#define ULL unsigned LL
#define fi first
#define se second
#define pb push_back
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lch(x) tr[x].son[0]
#define rch(x) tr[x].son[1]
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
typedef pair<int,int> pll;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const LL mod = (int)1e9+;
const int N = 2e5 + ;
struct Node{
int x1, y1, x2, y2, op, id;
}A[N], B[N];
int xsz, ysz;
int x[N], y[N];
int tmp[N];
int ans[N];
char s[];
struct bit_tree{
int tree[N], tot;
void add(int x, int v){
for(int i = x; i < N; i += i & (-i)){
tree[i] += v;
}
tot += v;
}
int query(int x){
int ret = ;
for(int i = x; i > ; i -= i & (-i)){
ret += tree[i];
}
return ret;
}
void Clear(){
tot = ;
memset(tree, , sizeof(tree));
}
}bit[];
bool cmp1(Node & a, Node & b){
int aop = abs(a.op), bop = abs(b.op);
int ax, bx;
if(aop) ax = a.x2;
else ax = a.x1;
if(bop) bx = b.x2;
else bx = b.x1;
if(ax != bx) return ax < bx;
return aop < bop;
}
bool cmp2(Node & a, Node & b){
int aop = abs(a.op), bop = abs(b.op);
int ax, bx;
if(!aop) ax = a.x2;
else ax = a.x1;
if(!bop) bx = b.x2;
else bx = b.x1;
if(ax != bx) return ax > bx;
return aop < bop;
}
void cdq(int l, int r){
if(l >= r) return ;
int mid = l+r >> ;
cdq(l, mid);
cdq(mid+, r);
int top = ;
for(int i = l; i <= mid; i++)
if(A[i].op) B[++top] = A[i];
for(int i = mid+; i <= r; i++)
if(!A[i].op) B[++top] = A[i];
sort(B+, B++top, cmp1);
for(int i = ; i <= top; i++){
if(B[i].op) {
bit[].add(B[i].y1, B[i].op);
bit[].add(B[i].y2, B[i].op);
}
else {
ans[B[i].id] += bit[].tot - bit[].query(B[i].y2);
ans[B[i].id] += bit[].query(B[i].y1-);
}
}
for(int i = ; i <= top; i++){
if(B[i].op) {
bit[].add(B[i].y1, -B[i].op);
bit[].add(B[i].y2, -B[i].op);
}
}
sort(B+, B++top, cmp2);
for(int i = ; i <= top; i++){
if(B[i].op) {
bit[].add(B[i].y1, B[i].op);
bit[].add(B[i].y2, B[i].op);
}
else {
ans[B[i].id] += bit[].tot - bit[].query(B[i].y2);
ans[B[i].id] += bit[].query(B[i].y1-);
}
}
for(int i = ; i <= top; i++){
if(B[i].op) {
bit[].add(B[i].y1, -B[i].op);
bit[].add(B[i].y2, -B[i].op);
}
}
}
int main(){
int n;
scanf("%d", &n);
int t = , tt = , num = , z;
for(int i = ; i <= n; ++i){
scanf("%s", s);
if(s[] == 'I'){
num++;
scanf("%d%d%d%d", &A[i].x1, &A[i].y1, &A[i].x2, &A[i].y2);
x[++xsz] = A[i].x1; x[++xsz] = A[i].x2;
y[++ysz] = A[i].y1; y[++ysz] = A[i].y2;
A[i].op = ;
tmp[++t] = i;
}
else if(s[] == 'D'){
num--;
scanf("%d", &z);
A[i] = A[tmp[z]];
A[i].op = -;
}
else {
++tt;
scanf("%d%d%d%d", &A[i].x1, &A[i].y1, &A[i].x2, &A[i].y2);
x[++xsz] = A[i].x1; x[++xsz] = A[i].x2;
y[++ysz] = A[i].y1; y[++ysz] = A[i].y2;
A[i].op = ;A[i].id = tt;
ans[tt] = num;
}
}
sort(x+, x+xsz+); sort(y+, y+ysz+);
xsz = unique(x+, x++xsz) - x - ;
ysz = unique(y+, y++ysz) - y - ;
for(int i = ; i <= n; i++){
A[i].x1 = lower_bound(x+, x++xsz, A[i].x1) - x;
A[i].x2 = lower_bound(x+, x++xsz, A[i].x2) - x;
A[i].y1 = lower_bound(y+, y++ysz, A[i].y1) - y;
A[i].y2 = lower_bound(y+, y++ysz, A[i].y2) - y;
if(A[i].op){
bit[].add(A[i].x1, A[i].op);
bit[].add(A[i].x2, A[i].op);
bit[].add(A[i].y1, A[i].op);
bit[].add(A[i].y2, A[i].op);
}
else {
num = ans[A[i].id];
ans[A[i].id] -= num - bit[].query(A[i].x2);
ans[A[i].id] -= bit[].query(A[i].x1-);
ans[A[i].id] -= num - bit[].query(A[i].y2);
ans[A[i].id] -= bit[].query(A[i].y1-);
}
}
for(int i = ; i < ; i++) bit[i].Clear();
cdq(, n);
for(int i = ; i <= tt; i++)
printf("%d\n", ans[i]);
return ;
}

CodeChef - QRECT Rectangle Query CDQ分治的更多相关文章

  1. Codechef SEP14 QRECT cdq分治+线段树

    题意 支持删除矩阵.插入矩阵.查询当前矩阵与之前有多少个矩阵相交 算相交的时候容斥一下:相交矩形数 = 总矩形数-X轴投影不相交的矩形数-Y轴投影不相交的矩形数-XY轴投影下都不相交的矩形数 最后一项 ...

  2. 算法笔记--CDQ分治 && 整体二分

    参考:https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 前置技能:树 ...

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

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

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

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

  5. 初识CDQ分治

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

  6. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  7. BZOJ2683 简单题(CDQ分治)

    传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...

  8. 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1439  Solved: 648[Submit][Status][Discuss ...

  9. 【BZOJ-1176&2683】Mokia&简单题 CDQ分治

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

随机推荐

  1. re模块学习

    一种模糊匹配的工具. 元字符有如下: . * {} [] + ? () \ ^ ,刚好十个. . : 代表单个任意字符,除换行符以外的 * :修饰前面的字符,代表前面字符出现0或者多次(无穷) {}: ...

  2. Linux基础文件权限

    一.基本权限 文件权限设置: 可以赋于某个用户或组 能够以何种方式 访问某个文件 权限对象:属主: u属组: g其他人: o 基本权限类型:读:r 4写:w 2执行: x 1 rwx rw- r-- ...

  3. 又拍云叶靖:OpenResty 在又拍云存储中的应用

    2019 年 7 月 6 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·上海站,又拍云平台开发部负责人叶靖在活动上做了<OpenRest ...

  4. Samba:基于公网 IP 的服务访问

    写在前面的话 由于使用过程中,发现如果 Samba 只用于内网访问,同事在外面甚至其它不是一个网段的同事就无法访问了.这显然不符合我们最终的需求,最后没法,只能把访问部署到云服务器上面去,此时问题来了 ...

  5. CentOS yum 源修改

    修改 CentOS 默认 yum 源为 mirrors.163.com 首先备份系统自带yum源配置文件/etc/yum.repos.d/CentOS-Base.repo [root@localhos ...

  6. JS DOM(文档对象模型)与BOM(浏览器对象模型)

    在JS中,对DOM(Document Object Model)对象和BOM(Browser Object Model )对象的操作是非常重要的内容.DOM主要包括HTML文档的属性和方法,像对HTM ...

  7. ImageLoader_显示图片

    public class MainActivity extends AppCompatActivity { private ListView lv; private List<Bean.Resu ...

  8. vscode中配置git

    vscode中配置git vscode 报错 未找到Git.请安装Git,或在"git.path" 设置中配置 第一步安装git git安装方法自行解决,提供git下载连接! gi ...

  9. 重学计算机组成原理(十一)- 门电路的"千里传音"

    人用纸和笔来做运算,都是用十进制,直接用十进制和我们最熟悉的符号不是最简单么? 为什么计算机里我们最终要选择二进制呢? 来看看,计算机在硬件层面究竟是怎么表示二进制的,你就会明白,为什么计算机会选择二 ...

  10. 配置Oracle透明网关用以连接 SQLServer经验总结

    一.情景介绍   业务中设计两个不同的系统,系统1和系统2,两个系统分别使用的是Oracle和SQLServer数据库.现需要在系统1的数据库中直接查询系统2数据库的数据.即在Oracle中执行SQL ...