题:http://codeforces.com/gym/101964/problem/K

分析:https://blog.csdn.net/qq_43202683/article/details/98115901

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(){
int sum=,x=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-')
x=;
ch=getchar();
}
while(ch>=''&&ch<='')
sum=(sum<<)+(sum<<)+(ch^),ch=getchar();
return x?sum:-sum;
}
inline void write(ll x){
if(x<)
putchar('-'),x=-x;
if(x>)
write(x/);
putchar(x%+'');
}
#define pb push_back
#define lowbit(x) (x&(-x))
const int M=5e5+;
int ans[M];
int tree[M];
void add(int i,int x){
while(i<M)
tree[i]+=x,i+=(i&(-i));
return ;
}
int query(int i){
int res=;
while(i){
res+=tree[i];
i-=(i&(-i));
}
return res;
}
struct node{
int x,y,op,id;
bool operator <(const node &b)const{
return id<b.id;
}
}a[M],temp[M];
vector<pair<int, int> > book;
void cdq1(int l, int r)//算点对矩阵的贡献(小于等于)
{
if(r-l<=) return;
int midd = (r+l)>>;
cdq1(l, midd);
cdq1(midd, r);
int i= l,j= midd,n = ;
while(i< midd &&j< r){
if(a[i].x <= a[j].x){
if(a[i].op == ){
add(a[i].y, );
book.push_back(make_pair(a[i].y, ));
}
temp[n++] = a[i++];
}
else{
if(a[j].op==){
ans[a[j].id]+=query(a[j].y);
}
else if(a[j].op==)
ans[a[j].id]-=query(a[j].y);
temp[n++]=a[j++];
}
}
while(i<midd)
temp[n++] = a[i++];
while(j<r){
if(a[j].op == )
ans[a[j].id] += query(a[j].y);
else if(a[j].op == )
ans[a[j].id] -= query(a[j].y);
temp[n++]=a[j++];
}
for(i =l;i<r;++i)
a[i]=temp[i - l];
for(i = ; i <book.size(); ++i)
add(book[i].first, -book[i].second);
book.clear();
return;
}
void cdq2(int l,int r)
{
if(r-l<= )
return;
int midd=(l+r)>>;
cdq2(l,midd);
cdq2(midd,r);
int i= l,j=midd,n=;
while(i<midd&&j<r){
if(a[i].x<a[j].x){
if(a[i].op == ){
add(a[i].y,);
book.pb(make_pair(a[i].y, ));
}
else if(a[i].op==){
add(a[i].y,-);
book.pb(make_pair(a[i].y,-));
}
temp[n++]=a[i++];
}
else{
if(a[j].op == ){
ans[a[j].id] +=query(a[j].y-);
}
temp[n++]=a[j++];
}
}
while(i<midd)
temp[n++]=a[i++];//temp[o++] = e[lp++]?? = temp[lp++],debug???
while(j<r){
if(a[j].op == ) {
ans[a[j].id] +=query(a[j].y - );
}
temp[n++]=a[j++];
}
for(i=l;i<r;i++)
a[i]=temp[i-l];
for(i=;i<book.size();i++)
add(book[i].first,-book[i].second);
book.clear();
return;
}
int lisan[M<<];
int main(){
int n=read();
int tot=,num=;
for(int i=;i<n;i++){
int op=read();
if(op==){
a[tot].x=read(),a[tot].y=read();
a[tot].op=,a[tot].id=i;
lisan[++num]=a[tot].x,lisan[++num]=a[tot].y;
tot++;
}
else{
int x1=read(),y1=read(),x2=read(),y2=read();
a[tot].op=,a[tot].x=x1-,a[tot].y=y1-,a[tot].id=i,tot++;
a[tot].op=,a[tot].x=x2,a[tot].y=y2,a[tot].id=i,tot++;
a[tot].op=,a[tot].x=x1-,a[tot].y=y2,a[tot].id=i,tot++;
a[tot].op=,a[tot].x=x2,a[tot].y=y1-,a[tot].id=i,tot++;
lisan[++num]=x1-,lisan[++num]=x2,lisan[++num]=y1-,lisan[++num]=y2;
} }
sort(lisan+,lisan+num+);
int m=unique(lisan+,lisan++num)-lisan-;
for(int i=;i<tot;i++){
a[i].x=lower_bound(lisan+,lisan++m,a[i].x)-lisan;
a[i].y=lower_bound(lisan+,lisan++m,a[i].y)-lisan;
// cout<<a[i].x<<"~~~~"<<a[i].y<<endl;
}
cdq1(,tot); sort(a,a+tot);
cdq2(,tot);
ll ANS=0ll;
for(int i=;i<n;i++){
ANS+=ans[i];
write(ANS);
puts("");
}
return ;
}

2018SEERC Points and Rectangles (CDQ分治)的更多相关文章

  1. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

  2. HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)

    Jam's problem again Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  3. HDU - 6183:Color it (线段树&动态开点||CDQ分治)

    Do you like painting? Little D doesn't like painting, especially messy color paintings. Now Little B ...

  4. CodeForces - 762E:Radio stations (CDQ分治||排序二分)

    In the lattice points of the coordinate line there are n radio stations, the i-th of which is descri ...

  5. HDU 6183 Color it cdq分治 + 线段树 + 状态压缩

    Color it Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Pro ...

  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. JAVA函数库

    1. 文件相关 1.1 判断目录是否存在 public static boolean dictionaryExist(String path) { File file = new File(path) ...

  2. 对自己有用的VS调试技巧

    设置下一条语句 编辑然后继续 符号越界后查看堆对象 查看数组的值 底部 设置下一条语句 返回顶部 一个典型的调试情况就是通过单步跟踪分析为什么一个函数调用失败了.当你发现一个函数调用的另一个函数返回错 ...

  3. Tomcat启动失败原因: More than one fragment with the name [spring_web] was found. 解决

    将一个eclipse上搭建好的项目移到idea开发时遇到的问题,tomcat启动时报了3个错误 -Nov- :: ms -Nov- ::)-127.0.0.1] org.apache.tomcat.u ...

  4. hook键盘钩子_非dll

    unit Unit1; // download by http://www.codefans.net interface uses Windows, Messages, SysUtils, Class ...

  5. virtualbox 共享文件夹 操作过程

    1.在本地主机上找到 VBoxGuestAdditions.iso,我的位置就在E:\Oracle\VirtualBox\VBoxGuestAdditions.iso 2 复制到虚拟机中,我用的是 x ...

  6. 吴裕雄--天生自然MySQL学习笔记:MySQL 元数据

    你可能想知道MySQL以下三种信息: 查询结果信息: SELECT, UPDATE 或 DELETE语句影响的记录数. 数据库和数据表的信息: 包含了数据库及数据表的结构信息. MySQL服务器信息: ...

  7. 关于python请求库Selenium安装所遇到的问题

    今天,初次接触python,在网上买了一本关于爬虫的书,因为之前电脑上存在python,所以就对着书直接进行的请求库的安装,安装的时候,主要遇到了下边一个问题,在安装Selenium的时候,出现以下提 ...

  8. UML的用例图

    1.概念理解 (1)用例图是UML多种图形语言的一种,最能体现系统结构,直观展现系统功能模块模型 (2)用例图用于描述用户与用例(角色与功能模块)之间的关联关系 (3)常用Power Designer ...

  9. 重载(overloading)和重写@Override

    一.重写:@Override 定义:字类方法覆盖父类方法,通俗来说就是方法里面的内容可以不一样,其他都一样. (1)必须保证权限大于等于父类的权限public>protetcted>默认& ...

  10. 基于迅为-i.MX6Q开发板制作镜像方法

    在“/home/imx6”目录(在前面编译 android 系统的时候新建过这个目录,如果没有可以自己新建一个)下,使用命令“mkdir minilinux/”新建 minilinux 目录,使用命令 ...