【算法】扫描线:差分+树状数组

【题意】转化模型后:求每个矩形覆盖多少点和每个点被多少矩形覆盖。n<=10^5。

【题解】经典的扫描线问题(二维偏序,二维数点)。

数点问题

将所有询问离线并离散化,然后按从上到下排序。

对于点被覆盖问题:

扫描线从上到下进行,遇到矩阵上边界维护区间加,遇到矩阵下边界维护区间减,也就是差分,遇到点单点查询。

每行的排序顺序是{矩阵加,点,矩阵减}。

可以线段树区间维护,也可以树状数组每行各自差分。

对于矩阵覆盖问题:

扫描线从上到下进行,遇到点单点加,遇到矩阵上边界查询区间点数,遇到矩阵下边界查询区间点数并减去上边界区间点数得到一个答案。

每行的排序顺序是{矩阵加,点,矩阵减}。

线段树和树状数组皆可。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std;
const int maxn=;
struct cyc1{int t,x;}a[maxn];
struct cyc2{int t,l,r,y;}b[maxn];
struct cyc{int x,y,y2,id,kind;}q[maxn];
int t[maxn],n,m,mx,my,tot,c[maxn],d[maxn],ans[maxn];
int read()
{
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
bool cmp(cyc a,cyc b)
{return a.x==b.x?a.kind>b.kind:a.x<b.x;}
bool cmp2(cyc a,cyc b)
{return a.x==b.x?a.kind>b.kind:a.x<b.x;}
int lowbit(int x){return x&(-x);}
void modify(int x,int k){for(int i=x;i<=my;i+=lowbit(i))t[i]+=k;}
int find(int x){int ans=;for(int i=x;i>=;i-=lowbit(i))ans+=t[i];return ans;}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
int u=read(),v=read();
a[i]=(cyc1){u,v};
c[++mx]=u;
d[++my]=v;
}
for(int i=;i<=m;i++){
int u=read(),v=read(),w=read(),z=read();
b[i]=(cyc2){u,v,w,z};
c[++mx]=u-z;c[++mx]=u+z;
d[++my]=v;d[++my]=w;
}
sort(c+,c+mx+);sort(d+,d+my+);
mx=unique(c+,c+mx+)-c-;
my=unique(d+,d+my+)-d-;
for(int i=;i<=n;i++){
q[++tot]=(cyc){lower_bound(c+,c+mx+,a[i].t)-c,lower_bound(d+,d+my+,a[i].x)-d,,i,};
}
for(int i=;i<=m;i++){
q[++tot]=(cyc){lower_bound(c+,c+mx+,b[i].t-b[i].y)-c,lower_bound(d+,d+my+,b[i].l)-d,lower_bound(d+,d+my+,b[i].r)-d,i,};
tot++;q[tot]=q[tot-];q[tot].x=lower_bound(c+,c+mx+,b[i].t+b[i].y)-c;q[tot].kind=-;
}
sort(q+,q+tot+,cmp);
for(int i=;i<=tot;i++){
if(q[i].kind){modify(q[i].y,q[i].kind);modify(q[i].y2+,-q[i].kind);}
else ans[q[i].id]=find(q[i].y);
}
for(int i=;i<=n;i++)printf("%d ",ans[i]);printf("\n");
sort(q+,q+tot+,cmp2);
memset(t,,sizeof(t));
for(int i=;i<=tot;i++){
if(q[i].kind){
if(q[i].kind==)ans[q[i].id]=find(q[i].y2)-find(q[i].y-);
else ans[q[i].id]=find(q[i].y2)-find(q[i].y-)-ans[q[i].id];
}
else modify(q[i].y,);
}
for(int i=;i<=m;i++)printf("%d ",ans[i]);
return ;
}

【STSRM13】绵津见的更多相关文章

  1. SRM13绵津见-终(扫描线+线段树/BIT)

    题目大意:求对于每个i求有多少个合法的j以及j对于几个i是合法的,合法的定义:l[i]<=x[j]<=r[i],T[i]-y[i]<=t[j]<=T[i]+y[i]. 设a[i ...

  2. SRM13

    由于种种原因,好像出了点锅……? 好在问题不是很大. 得分比我估的要低啊. 木之本樱 计算几何送分题 就是叫你求一共有多少组四线共点,O(n^4)暴力可以过初.枚举两条线,求出交点之后求有多少条直线过 ...

  3. 汕头市队赛 SRM1X T2 ——扫描线

    绵津见-终 SRM 13 背景 “西瓜也是可以种在海上的!”——绵津见 然而种在海上的西瓜最需要防范的,是时不时会涌向瓜田的阵阵海浪. 幸好,身为海神的绵津见可以释放魔法“水平如镜”来阻止海浪拍打西瓜 ...

  4. Material Design Reveal effect(揭示效果) 你可能见过但是叫不出名字的小效果

    Material Design Reveal effect(揭示效果) 你可能见过但是叫不出名字的小效果 前言: 每次写之前都会来一段(废)话.{心塞...} Google Play首页两个tab背景 ...

  5. 你可曾见过如此简单粗暴的JavaScript解说 -- if 判断的正确打开方式?

    在JavaScript中,对于 if else 的逻辑判断你肯定非常熟悉,本文罗列了几种你不一定知道的简写方式,仅供参考. 例子: 已知小明考了68分,小于60分为不及格,大于60分为及格,问:小明是 ...

  6. Java正则速成秘籍(三)之见招拆招篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  7. 腾讯网2016回响中国:华清远见荣获2016年度知名IT培训品牌

    12月1日,由腾讯网主办的“2016回响中国·腾讯网教育年度盛典”上,揭晓了“2016腾讯网教育年度总评榜”榜单.高端IT就业培训专家——华清远见教育集团凭借自身优质的高薪IT就业服务优势成功入围,荣 ...

  8. 华清远见成为ARM大学计划正式合作伙伴

    来源:华清远见嵌入式学院 近日,华清远见教育集团成为ARM大学计划合作伙伴,这是ARM大学计划合作伙伴中的国内唯一教育机构.此次合作是ARM公司对华清远见教育集团的高度认可,也充分证明了华清远见这些年 ...

  9. Qcon会议之所见所想

    作为普通码农一枚,Qcon是俺参与过的最高级的技术大会了.大会共历时三天,因为俺第二天就得赶火车休个五一大长假,所以只参加了第一天4/25号的会议(其他俩天自然有其他同事会去观摩),不过第一天的会议有 ...

随机推荐

  1. 从入门到不放弃——OO第一次作业总结

    写在最前面: 我是一个这学期之前从未接触过java的小白,对面向对象的理解可能也只是停留在大一python讲过几节课的面向对象.幸运的是,可能由于前三次作业难度还是较低,并未给我造成太大的困难,接下来 ...

  2. Swift-switch使用注意点

    1.swift后面的()可以省略 2.case后面的额break可以省略 3.如果想产生case穿透使用fallthrough 4.case后面可以判断多个条件","分割 5.sw ...

  3. workstation vmware 制作vm模板

    [root@VM166136 ~]# cat copy_vmware.sh #!/bin/bash if [ $(id -u) -ne 0 ];then echo "Please use t ...

  4. (转)关于ActiveMQ的配置

    目前常用的消息队列组建无非就是MSMQ和ActiveMQ,至于他们的异同,这里不想做过多的比较.简单来说,MSMQ内置于微软操作系统之中,在部署上包含一个隐性条件:Server需要是微软操作系统.(对 ...

  5. Kafka及Spring Cloud Stream

    安装 下载kafka http://mirrors.hust.edu.cn/apache/kafka/2.0.0/kafka_2.11-2.0.0.tgz kafka最为重要三个配置依次为:broke ...

  6. AtCoder Regular Contest 083 D: Restoring Road Network

    题意 有一张无向带权连通图(点数<=300),给出任意两点i,j之间的最短路长度dis[i][j].问是否存在一张这样的无向图.如果不存在输出-1.如果存在输出所有这样的无向图中边权和最小的一张 ...

  7. java实现PV操作

    package com.jayfulmath.designpattern.command; import java.util.concurrent.Semaphore; /* P(S): ①将信号量S ...

  8. 关于upper、lower bound 的探讨

    lower_bound(A, A+n, x) - A  返回第一个大于等于x的数的下标 lower_bound(A, A+n, x) - A - 1 返回最后一个小于x的数的下标 upper_boun ...

  9. 大坑!有网,电脑qq登不上去!!

    手机qq --> 设置 --> 账号设备安全 -->  允许手机电脑同步在线 或是其他设置干扰导致

  10. 2017-2018-2 20165218 实验四《Android开发基础》实验报告

    实验三 Android开发基础 课程:java程序设计 姓名:赵冰雨 学号:20165218 指导教师:娄嘉鹏 实验日期:2018.4.14 实验内容: 1.基于Android Studio开发简单的 ...