正题


题目大意

有若干个红点和蓝点,对于每一对红点和蓝点,若距离大于DDD则蓝点压制红点,否则红点压制蓝点。然后红点和蓝点之间也有不定的压制关系。

求有多少个三角要求AAA压制BBB,BBB压制CCC,CCC压制AAA且至少包含一个红点和蓝点。求三角数量的最小值和最大值。


解题思路

我们考虑最暴力的做法先,我们可以枚举两个相同颜色的点,枚举他们之间的关系,然后找三角。

我们定义covxcov_xcovx​表示在xxx的DDD范围以内与他异色的点的数量,covx,ycov_{x,y}covx,y​表示同时在x,yx,yx,y两个点的DDD范围内的异色点的数量,对于包含两个红色点的方案数为
∑x,y∈redmax{covx−covx,y,covy−covx,y}\sum_{x,y\in red}max\{cov_x-cov_{x,y},cov_{y}-cov_{x,y}\}x,y∈red∑​max{covx​−covx,y​,covy​−covx,y​}
∑x,y∈redmax{covx,covy}−covx,y\sum_{x,y\in red}max\{cov_x,cov_y\}-cov_{x,y}x,y∈red∑​max{covx​,covy​}−covx,y​
∑x,y∈redmax{covx,covy}−∑z∈bluecovx,y\sum_{x,y\in red}max\{cov_x,cov_y\}-\sum_{z\in blue} cov_{x,y}x,y∈red∑​max{covx​,covy​}−z∈blue∑​covx,y​
那我们发现对于每个蓝点zzz被统计的次数就是Ccovz2C_{cov_z}^{2}Ccovz​2​
⇒∑x,y∈redmax{covx,covy}−∑z∈blueCcovz2\Rightarrow \sum_{x,y\in red}max\{cov_x,cov_y\}-\sum_{z\in blue} C_{cov_z}^{2}⇒x,y∈red∑​max{covx​,covy​}−z∈blue∑​Ccovz​2​
然后我们发现如果计算出covcovcov数组即可在O(nlog⁡n)O(n\log n)O(nlogn)的时间内统计答案(排个序瞎搞搞就好)

那如何统计covcovcov数组,我们可以将每个点(x,y)(x,y)(x,y)转换为(x−y,x+y)(x-y,x+y)(x−y,x+y)然后将曼哈顿距离转换为切比雪夫距离。这样我们发现covcovcov就是在(x,y)(x,y)(x,y)这个点为中心的2D∗2D2D*2D2D∗2D的矩阵包含的点的个数,用扫描线统计即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=200100;
struct node{ll x,y;
}a[N],b[N];
ll n,m,D,y[N*3],mov,maxs,mins,covn[N],covm[N],cnt;
struct Seq_node{struct Tree_node{ll l,r,w;}t[N*16];void Build(ll x,ll l,ll r){t[x].l=l;t[x].r=r;if(l==r) return;ll mid=(l+r)/2;Build(x*2,l,mid);Build(x*2+1,mid+1,r);}ll Ask(ll x,ll l,ll r){if(t[x].l==l&&t[x].r==r)return t[x].w;ll mid=(t[x].l+t[x].r)/2;if(r<=mid)    return Ask(x*2,l,r);else if(l>mid) return Ask(x*2+1,l,r);else return Ask(x*2,l,mid)+Ask(x*2+1,mid+1,r);}void Change(ll x,ll pos,ll val){if(t[x].l==t[x].r){t[x].w+=val;return;}ll mid=(t[x].l+t[x].r)/2;if(pos<=mid) Change(x*2,pos,val);else Change(x*2+1,pos,val);t[x].w=t[x*2].w+t[x*2+1].w;}
}T;
bool cMp(node x,node y)
{return x.x<y.x;}
int main()
{freopen("mhw.in","r",stdin);freopen("mhw.out","w",stdout);scanf("%lld%lld%lld",&n,&m,&D);for(ll i=1;i<=n;i++){ll X,Y;scanf("%lld%lld",&X,&Y);a[i].x=X+Y;a[i].y=X-Y;y[++cnt]=a[i].y;y[++cnt]=a[i].y+D;y[++cnt]=a[i].y-D;}for(ll i=1;i<=m;i++){ll X,Y;scanf("%lld%lld",&X,&Y);b[i].x=X+Y;b[i].y=X-Y;y[++cnt]=b[i].y;y[++cnt]=b[i].y+D;y[++cnt]=b[i].y-D;} sort(b+1,b+1+m,cMp);sort(a+1,a+1+n,cMp);sort(y+1,y+1+cnt);cnt=unique(y+1,y+1+cnt)-(y+1);T.Build(1,1,cnt);ll l=0,r=0;for(ll i=1;i<=n;i++){while(l<m&&b[l+1].x<a[i].x-D){ll Y=lower_bound(y+1,y+1+cnt,b[++l].y)-y;T.Change(1,Y,-1);}while(r<m&&b[r+1].x<=a[i].x+D){ll Y=lower_bound(y+1,y+1+cnt,b[++r].y)-y;T.Change(1,Y,1);}ll L=lower_bound(y+1,y+1+cnt,a[i].y-D)-y,R=lower_bound(y+1,y+1+cnt,a[i].y+D)-y;covn[i]=T.Ask(1,L,R);}while(l<m){ll Y=lower_bound(y+1,y+1+cnt,b[++l].y)-y;T.Change(1,Y,-1);}while(r<m){ll Y=lower_bound(y+1,y+1+cnt,b[++r].y)-y;T.Change(1,Y,1);}l=0,r=0;for(ll i=1;i<=m;i++){while(l<n&&a[l+1].x<b[i].x-D){ll Y=lower_bound(y+1,y+1+cnt,a[++l].y)-y;T.Change(1,Y,-1);}while(r<n&&a[r+1].x<=b[i].x+D){ll Y=lower_bound(y+1,y+1+cnt,a[++r].y)-y;T.Change(1,Y,1);}ll L=lower_bound(y+1,y+1+cnt,b[i].y-D)-y,R=lower_bound(y+1,y+1+cnt,b[i].y+D)-y;covm[i]=T.Ask(1,L,R);}sort(covn+1,covn+1+n);sort(covm+1,covm+1+m);for(ll i=1;i<=n;i++)maxs+=covn[i]*(i-1),mins+=covn[i]*(n-i),mov+=covn[i]*(covn[i]-1)/2;for(ll i=1;i<=m;i++)maxs+=covm[i]*(i-1),mins+=covm[i]*(m-i),mov+=covm[i]*(covm[i]-1)/2;printf("%lld %lld",mins-mov,maxs-mov);
}

jzoj6297-世界第一的猛汉王【切比雪夫距离,扫描线】相关推荐

  1. 【九校3D2T3】世界第一的猛汉王

    [问题描述] 卡普地公司举办了「世界第一的猛汉王」全球大会,来自世界各地的猛汉为了争夺「猛汉王」的名号前来一决高下.现在举行的是弓箭组选拔赛.卡普地公司为比赛新建了一张PVP地图--「猛汉竞技场」.有 ...

  2. JZOJ 6297. 2019.08.10【NOIP提高组A】世界第一的猛汉王

    DescriptionDescriptionDescription 给定nnn个红点和mmm个白点,当异色点曼哈顿距离不大于DDD存在压制关系,相同颜色的点存在关系但是由你决定,求最少和最多三个点满足 ...

  3. [线段树][扫描线][计数] Jzoj P6297 世界第一的猛汉王

    Description 题解 代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 ...

  4. 凝血酶分子机器人_《自然》子刊:厉害啊!中科院团队发明世界第一个智能抗癌DNA纳米机器人,可精准阻断肿瘤血管,饿死肿瘤 | 奇点猛科技...

    原标题:<自然>子刊:厉害啊!中科院团队发明世界第一个智能抗癌DNA纳米机器人,可精准阻断肿瘤血管,饿死肿瘤 | 奇点猛科技 长大其实挺不容易,相声里面说过,危险是无处不在的.有人被大鹅追 ...

  5. 曼哈顿距离,欧式距离,明式距离,切比雪夫距离,汉明距离

    根据我浅薄的知识,以及粗浅的语言,随意总结一下. 1.马氏距离(Manhattan distance),还见到过更加形象的,叫出租车距离的.具体贴一张图,应该就能明白. 上图摘自维基百科,红蓝黄皆为曼 ...

  6. BZOJ 3170: [Tjoi 2013]松鼠聚会 切比雪夫距离

    3170: [Tjoi 2013]松鼠聚会 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  7. P2906 [USACO08OPEN]Cow Neighborhoods G 切比雪夫距离 + 并查集 + set

    传送门 考虑将曼哈顿距离转换成切比雪夫距离,这样问题就变成了max(∣x1−x2∣,∣y1−y2∣)≤dmax(|x_1-x_2|,|y_1-y_2|)\le dmax(∣x1​−x2​∣,∣y1​− ...

  8. 曼哈顿距离与切比雪夫距离的转化及prufer序列

    目录 曼哈顿距离与切比雪夫距离的相互转化 prufer序列 1. 曼哈顿距离 与 切比雪夫距离 的相互转化 曼哈顿距离 |x1−x2|+|y1−y2|=max(x1−x2+y1−y2,x1−x2−y1 ...

  9. 中国可燃冰储量世界第一,2030年能实现商业性开发吗?多难开采?

    随着人类进入现代工业文明,人们对于石油气资源的依赖不断加深.我们生活衣食住行的各个方面都离不开石油气资源的加持,因此,石油气资源又被称为工业的"血液",无论是在日常生活之中还是在国 ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第18期)
  2. 免费机器学习课程爆红:从概率与统计到全栈深度学习,英伟达工程师小姐姐整理...
  3. Eclipse单元测试Android编程,在Eclipse中进行Android单元测试-Fun言
  4. SQL语言基本语句介绍
  5. python程序流程控制_python流程控制
  6. A Story of One Country (Hard)(中途相遇法/启发式分裂)
  7. 解决:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
  8. C++中如何判断文件是否存在
  9. 查看目录下所有文件 dir 。
  10. java系统源代码_JAVA学生管理系统源代码
  11. Maven 教程:IDEA开发环境中maven 项目配置JDK9,JDK10,JDK11,JDK12..等EA版本的配置方法 系列教程一
  12. Gosn解决在集合中int自动转换为duble类型
  13. hbuilderx为什么打不开_windows系统,HBuilderX无法启动、点击无反应、或启动报错的解决方案...
  14. Unity平行光源方向_WorldSpaceLightPos0自定义
  15. 一起来看看,除夕夜有哪些走心的文案?
  16. 火焰识别python_一种基于人工智能的火焰图像识别方法与流程
  17. 公安网络及计算机信息系统安全,违反公安网络和信息安全保密工作规定及公安机关有关公安网络、计算机和信息应用系..._考试资料网...
  18. Ubuntu1804安装nginx
  19. html监听多选框事件,复选框事件监听使用求助
  20. mysql 用法之 统计各地区注册人数

热门文章

  1. 5码默认版块_5个小众的生活学习类的宝藏App
  2. linux系统管理命令使用,Linux系统管理使用之基本命令(1)
  3. 在鹅厂,我作为一个Java 程序员每天都在摸鱼!!!
  4. linux 逻辑卷 pe size 4.00 mib大小怎么改,linux逻辑卷的建立
  5. 自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程
  6. MATLAB函数gensurf,MATLAB模糊逻辑工具箱函数.ppt
  7. java numberformat异常_Java NumberFormat格式化float类型的bug
  8. 自动备份html文件,windows下定期自动备份本地文件(文件夹)
  9. mysql中临时修改参数用什么关键字_postgresql 中的参数查看和修改方式
  10. 数据结构与算法--我们来玩丢手绢(约瑟夫环问题)