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

【题意】转化模型后:求每个矩形覆盖多少点和每个点被多少矩形覆盖。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. [并查集] More is Better

    题目描述 Mr Wang wants some boys to help him with a project. Because the project is rather complex, the ...

  2. 技嘉主板+AMD CPU开启CPU虚拟化方法

    硬件环境:技嘉AB350+AMD Ryzen 5 1600X 由于安装虚拟机的需要,所以要开启CPU的虚拟化. 首先进入BIOS. 然后如图:(M.I.T-高级频率设定-CPU超频进阶设置-SVM M ...

  3. jQuery之属性

    1. 操作任意属性 attr() 操作非布尔值的 removeAttr() prop() 操作布尔值的2. 操作class属性 addClass() 添加class属性 removeClass() 移 ...

  4. PAT 甲级 1035 Password

    https://pintia.cn/problem-sets/994805342720868352/problems/994805454989803520 To prepare for PAT, th ...

  5. jQuery的滚动监听

    jQuery的滚动监听 1.当前滚动的地方的窗口顶端到整个页面顶端的距离: var winPos = $(window).scrollTop(); 2.获取指定元素的页面位置: $(val).offs ...

  6. 【C++】new和delete表达式与内存管理

    new和delete表达式可以用来动态创建和释放单个对象,也可以用来动态创建和释放动态数组. 定义变量时,必须指定其数据类型和名字.而动态创建对象时,只需指定其数据类型,而不必为该对象命名.new表达 ...

  7. HBASE+Solr实现详单查询--转

    原文地址:https://mp.weixin.qq.com/s?srcid=0831kfMZgtx1sQbzulgeIETs&scene=23&mid=2663994161&s ...

  8. BZOJ4977 跳伞求生(贪心)

    如果现在选定了一些要求消灭的敌人而不考虑积分,显然应该让每个敌人被刚好能消灭他的人消灭.再考虑最大化积分,显然我们应该优先消灭ci-bi大的敌人,所选用的a也应尽量大.于是按ci-bi从大到小排序,用 ...

  9. 基于ORM实现用户登录

    1. 与数据库中的数据进行比较,检验用户名和密码是否正确. 2. 拿到的是QuerySet类型,类似于一个列表.验证成功/失败,返回到不同的页面. u = request.POST.get('user ...

  10. 2个 List<T>进行数据合并

    var userF = new List<User>(); User m1 = new User() { Id = "0" }; userF.Add(m1); var ...