bzoj 4822: [Cqoi2017]老C的任务【扫描线+树状数组+二维差分】
一个树状数组能解决的问题分要用树套树……还写错了我别是个傻子吧?
这种题还是挺多的,大概就是把每个矩形询问差分拆成四个点前缀和相加的形式(x1-1,y1-1,1)(x2.y2,1)(x1-1,y2,-1)(x2,y1-1,-1),然后离散化,打上id丢去按x排序,点也按x排序。
然后按照x扫描,树状数组维护到当前x坐行标前缀和的y,每次先把坐标等于x的点加进树状数组,然后查询乘上相应权值(+-1)加到相应id的ans数组里
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int N=500005;
int n,m,x[N],tx,hax,y[N],ty,hay,con;
long long ans[N],t[N<<2];
map<int,int>hx,hy;
struct qwe
{
int x,y,id;
long long p;
qwe(int X=0,int Y=0,long long P=0,int ID=0)
{
x=X,y=Y,p=P,id=ID;
}
}p[N],q[N<<2];
bool cmp(const qwe &a,const qwe &b)
{
return a.x<b.x;
}
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
int lb(int x)
{
return x&(-x);
}
void update(int x,int v)
{
for(int i=x;i<=hay;i+=lb(i))
t[i]+=v;
}
long long ques(int x)
{
long long re=0;
for(int i=x;i>0;i-=lb(i))
re+=t[i];
return re;
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
p[i].x=read(),p[i].y=read(),p[i].p=read();
x[++tx]=p[i].x,y[++ty]=p[i].y;
}
for(int i=1;i<=m;i++)
{
int x1=read(),y1=read(),x2=read(),y2=read();
if(x1>x2)
swap(x1,x2);
if(y1>y2)
swap(y1,y2);
x[++tx]=x1-1,x[++tx]=x2;
y[++ty]=y1-1,y[++ty]=y2;
q[++con]=qwe(x2,y2,1,i);
q[++con]=qwe(x1-1,y1-1,1,i);
q[++con]=qwe(x1-1,y2,-1,i);
q[++con]=qwe(x2,y1-1,-1,i);
}
sort(x+1,x+1+tx);
sort(y+1,y+1+ty);
for(int i=1;i<=tx;i++)
if(i==1||x[i]!=x[i-1])
hx[x[i]]=++hax;
for(int i=1;i<=ty;i++)
if(i==1||y[i]!=y[i-1])
hy[y[i]]=++hay;
for(int i=1;i<=n;i++)
p[i].x=hx[p[i].x],p[i].y=hy[p[i].y];
for(int i=1;i<=con;i++)
q[i].x=hx[q[i].x],q[i].y=hy[q[i].y];
sort(p+1,p+1+n,cmp);
sort(q+1,q+1+con,cmp);
int w1=1,w2=1;
for(int i=1;i<=hax;i++)
{
while(w1<=n&&p[w1].x==i)
{
update(p[w1].y,p[w1].p);
w1++;
}
while(w2<=con&&q[w2].x==i)
{
ans[q[w2].id]+=q[w2].p*ques(q[w2].y);
w2++;
}
}
for(int i=1;i<=m;i++)
printf("%lld\n",ans[i]);
return 0;
}
bzoj 4822: [Cqoi2017]老C的任务【扫描线+树状数组+二维差分】的更多相关文章
- [BZOJ4822][CQOI2017]老C的任务(扫描线+树状数组)
4822: [Cqoi2017]老C的任务 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 379 Solved: 203[Submit][Statu ...
- BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)
整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...
- BZOJ4822[Cqoi2017]老C的任务——树状数组(二维数点)
题目描述 老 C 是个程序员. 最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C 轻松 地完成了系统的大部分功能,并把其中一个功能交给你来实 ...
- BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树
题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...
- BZOJ 1878 [SDOI2009]HH的项链(扫描线+树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1878 [题目大意] 给出一个数列,给出m个查询,每次查询一个区间中不相同的数字个数 [ ...
- BZOJ 1818: [Cqoi2010]内部白点 扫描线+树状数组
问题转化为求每一个极长横线段与极长纵线段的交点个数. 这个东西用扫描线+树状数组维护一下就可以了. code: #include <cstdio> #include <algorit ...
- FZU 2225 小茗的魔法阵 扫描线+树状数组
这个题和一个CF上的找"Z"的题差不多,都是扫描线+树状数组 从右上角的主对角线开始扫描,一直扫到左下角,每次更新,右延伸等于该扫描线的点,注意在其所在的树状数组更新就好了 时间复 ...
- 【BZOJ1818】[Cqoi2010]内部白点 扫描线+树状数组
[BZOJ1818][Cqoi2010]内部白点 Description 无限大正方形网格里有n个黑色的顶点,所有其他顶点都是白色的(网格的顶点即坐标为整数的点,又称整点).每秒钟,所有内部白点同时变 ...
- HDU 5862 Counting Intersections 扫描线+树状数组
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Counting Intersections Time Limit: 12000/ ...
随机推荐
- Java线程的5种状态及切换(透彻讲解)
http://blog.csdn.net/pange1991/article/details/53860651
- java课堂测试—根据模板完成一个简单的技术需求征集系统
课堂上老师发布了一个页面模板要求让我们实现一个系统的功能,模仿以后后端的简单工作情况. 然后在这个模板的基础上,提供了一个注册的网页模板,接着点击注册的按钮,发现register里面调用了zhu/zh ...
- linux signal 列表
Linux 信号表 Linux支持POSIX标准信号和实时信号.下面给出Linux Signal的简表,详细细节可以查看man 7 signal. 默认动作的含义如下: Term 终止进程 ...
- @Aspect注解无效
Pointcut的execution配置正确的话,检查下,是否加了以下jar包 <!-- http://mvnrepository.com/artifact/org.aspectj/aspect ...
- Win7查看本地是否安装JDK及安装路径的方法
工具/原料 win7 方法/步骤 1 开始->点击运行,输入:cmd 2 然后在命令提示符中,输入:java -version 假如看到有版本提示那么安装成功 3 假如忘记了java ...
- Docker+Drone做Java/Tomcat的CI服务
1. 安装Docker(略过) 2. 编写docker-compose.yaml version: '2' services: drone-server: image: drone/drone:0.8 ...
- 【Scrapy】Selectors
Constructing selectors For convenience,response objects exposes a selector on .selector attribute,it ...
- HDU OJ Max sum 题目1003
#include <iostream> #include<stdio.h> #include<stdlib.h> using namespace std; i ...
- 实习生面试相关-b
面试要准备什么 有一位小伙伴面试阿里被拒后,面试官给出了这样的评价:“……计算机基础,以及编程基础能力上都有所欠缺……”.但这种笼统的回答并非是我们希望的答案,所谓的基础到底指的是什么? 作为一名 i ...
- NSUserDefaults 保存自己定义对象
项目里json返回的一个model须要保存下来,这个model是固定的没必须去创建表,想到了NSUserDefaults来存储,暂不考虑安全问题. NSUserDefaults没法直接存储一个对象.在 ...