题目描述

摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统。和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米。但其真正高科技之处在于,它能够回答形如“给定区域内有多少名用户?”的问题。

在定位系统中,世界被认为是一个W×W的正方形区域,由1×1的方格组成。每个方格都有一个坐标(x,y),1<=x,y<=W。坐标的编号从1开始。对于一个4×4的正方形,就有1<=x<=4,1<=y<=4(如图):

请帮助Mokia公司编写一个程序来计算在某个矩形区域内有多少名用户。

输入输出格式

输入格式:

有三种命令,意义如下:

命令 参数 意义

  • 0 W 初始化一个全零矩阵。本命令仅开始时出现一次。
  • 1 x y A 向方格(x,y)中添加A个用户。A是正整数。
  • 2 X1 Y1 X2 Y2 查询X1<=x<=X2,Y1<=y<=Y2所规定的矩形中的用户数量
  • 3 无参数 结束程序。本命令仅结束时出现一次。

输出格式:

对所有命令2,输出一个一行整数,即当前询问矩形内的用户数量。

输入输出样例

输入样例#1: 复制

0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3
输出样例#1: 复制

3
5

说明

对于所有数据:

1<=W<=2000000
1<=X1<=X2<=W
1<=Y1<=Y2<=W
1<=x,y<=W
0<A<=10000
命令1不超过160000个。
命令2不超过10000个。

题解

树状数组没有清空结果调了几个小时……快疯了……

坐标范围太大,先考虑离散

我们把一个操作看成$(a,x,y)$的形式,其中$a$代表时间,$x,y$代表坐标(查询操作可以通过差分拆成四个操作)

然后就是一个三维偏序问题了,用CDQ+树状数组解决

时间这一维是默认有序的

$x$这一维可以用CDQ自带的归并排好序

$y$这一维用树状数组就可以求出答案

 //minamoto
#include<iostream>
#include<cstdio>
#include<algorithm>
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char sr[<<],z[];int C=-,Z;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
inline void print(int x){
if(C><<)Ot();if(x<)sr[++C]=,x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=;
struct node{
int x,y,d,id;
inline void add(int a,int b,int c,int _id=)
{x=a,y=b,d=c,id=_id;}
inline bool operator <(const node &b)const{
return x!=b.x?x<b.x:
y!=b.y?y<b.y:
d>b.d;
}
}a[N],p[N];int n,m,ans[N];
int c[N*];
inline void add(int x,int val){
for(int i=x;i<=n;i+=i&(-i))
c[i]+=val;
}
inline int query(int x){
int res=;
for(int i=x;i;i-=i&(-i))
res+=c[i];
return res;
}
inline void clear(int x){
for(int i=x;i<=n;i+=i&(-i))
if(c[i]) c[i]=;
else return;
}
void cdq(int l,int r){
if(l==r) return;
int mid=(l+r)>>;
cdq(l,mid),cdq(mid+,r);
int i=l,j=l,k=mid+;
while(j<=mid&&k<=r){
if(p[j]<p[k]){
if(p[j].d) add(p[j].y,p[j].d);
a[i++]=p[j++];
}
else{
if(!p[k].d) ans[p[k].id]+=query(p[k].y);
a[i++]=p[k++];
}
}
while(j<=mid) a[i++]=p[j++];
while(k<=r){
if(!p[k].d) ans[p[k].id]+=query(p[k].y);
a[i++]=p[k++];
}
for(int i=l;i<=r;++i){
clear(a[i].y);p[i]=a[i];
}
}
int main(){
//freopen("testdata.in","r",stdin);
n=read(),n=read();
for(int x,y,xx,yy,opt;(opt=read())!=;){
x=read(),y=read(),xx=read();
if(opt&){
p[++m].add(x,y,xx,m+);
ans[m]=-;
}
else{
yy=read();
p[++m].add(xx,yy,,m+),p[++m].add(x-,yy,,m+);
p[++m].add(xx,y-,,m+),p[++m].add(x-,y-,,m+);
}
}
cdq(,m);
for(int i=;i<=m;++i)
if(~ans[i]){
int k=ans[i]-ans[i+]-ans[i+]+ans[i+];
print(k);i+=;
}
Ot();
return ;
}

COGS1752. [BOI2007]摩基亚Mokia(CDQ,树状数组)的更多相关文章

  1. COGS1752. [BOI2007]摩基亚Mokia CDQ

    CDQ的板子题 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  2. COGS1752. [BOI2007]摩基亚Mokia

    1752. [BOI2007]摩基亚Mokia ★★☆   输入文件:mokia.in   输出文件:mokia.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 摩尔瓦 ...

  3. COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)

    题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...

  4. COJS 1752. [BOI2007]摩基亚Mokia

    1752. [BOI2007]摩基亚Mokia ★★★   输入文件:mokia.in   输出文件:mokia.out   简单对比时间限制:5 s   内存限制:128 MB [题目描述] 摩尔瓦 ...

  5. 分治(CDQ):[BOI2007]摩基亚Mokia

    [题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ...

  6. 【COGS1752】 BOI2007—摩基亚Mokia

    http://cogs.pro/cogs/problem/problem.php?pid=1752 (题目链接) 题意 给出$n*n$的棋盘,单点修改,矩阵查询. Solution 离线以后CDQ分治 ...

  7. Bzoj1176:Mokia&Cogs1752:[BOI2007]摩基亚Mokia

    题目 Cogs 没有Bzoj的权限号 Sol 离线,\(CDQ\)分治,把询问拆成\(4\)个,变成每次求二位前缀和 那么只要一个修改操作(关键字为时间,\(x\),\(y\))都在这个询问前,就可以 ...

  8. [BZOJ1176][Balkan2007]Mokia cdq+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 3134  Solved: 1395[Submit][S ...

  9. [COGS 1752] 摩基亚Mokia

    照例先上题面 1752. [BOI2007]摩基亚Mokia 输入文件:mokia.in   输出文件:mokia.out 时间限制:1.5 s   内存限制:128 MB [题目描述] 摩尔瓦多的移 ...

随机推荐

  1. 为阿里云ECS服务器二级域名绑定tomcat子目录,实现一个IP多个二级域名

    摘要:前几天租了阿里云ECS服务器,选择的Windows系统,并在服务器上部署了tomcat服务器,随后我又买了一个域名,可一个域名只能指向一个IP地址,包括二级域名也只能指向一个IP地址,并不能指向 ...

  2. UNITY插件信息收集

    2018.8.7 UNITY超级优化神器 : Amplify Impostors

  3. ubuntu ibus&language 启动失败

    [ubuntu ibus&language 启动失败] 版本:ubuntu 10.04 现像:language support & ibus 无法启动,导致无法使用中文输入法 原因:l ...

  4. Python_08-常用模块

    1     常用模块介绍 1.1      os模块 1.2      sys模块 1.3      built-in内置模块 1.4      time模块 1.5      re模块 2     ...

  5. JAVA高并发线程

    一.JAVA高级并发 1.5JDK之后引入高级并发特性,大多数的特性在java.util.concurrent 包中,是专门用于多线程发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发 ...

  6. Golang之继承,多重继承(struct)

    热乎的代码来了 package main import "fmt" /* 继承 一个结构体嵌到另一个结构体,称作组合 匿名和组合的区别 如果一个struct嵌套了另一个匿名结构体, ...

  7. linux git server 简易搭建 (ssh访问)

    git的服务器搭建,如果无需权限控制,仅团队内部使用,初始化一个服务器仓库,其他人通过ssh访问这个文件夹即可.如需复杂的管理,建议使用gitlab. yum install git -y id gi ...

  8. Python 关于数组矩阵变换函数numpy.nonzero(),numpy.multiply()用法

    1.numpy.nonzero(condition),返回参数condition(为数组或者矩阵)中非0元素的索引所形成的ndarray数组,同时也可以返回condition中布尔值为True的值索引 ...

  9. Flash的不同位宽与CPU地址线的接线问题?

    一般Flash都有8.16.32等这些不同的位宽,当然说白了就是Flash的数据线位数. 在Flash与CPU的地址线的连接问题时:不同位宽的有不同的连接方法: 一般是:位宽为8时CPU的ADDR0与 ...

  10. php 访问用友u8数据

    <?php namespace app\api\controller; use think\Controller; use think\Db; use think\Log; /** * desc ...