【问题描述】

卡普地公司举办了「世界第一的猛汉王」全球大会,来自世界各地的猛汉为了争夺「猛汉王」的名号前来一决高下。现在举行的是弓箭组选拔赛。卡普地公司为比赛新建了一张PVP地图——「猛汉竞技场」。有许多使用弓的猛汉在这里互相较量。他们中的一些装填了「接击瓶」,这使得他们在接近战中会占有一定优势,但是在远程战中会相当劣势。具体来说如下:

假设q装填了「接击瓶」而p没有,则当他们的曼哈顿距离大于D时,p压制q,反之q压制p。如果pq都装填了「接击瓶」或者都没有,则他们之间仍然会存在一个客观上的单向压制关系,但是在比赛刚开始时无法得知。

竞技场上一共有n+m个猛汉,其中n个装填了「接击瓶」,另外m个没有。每个猛汉降临到竞技场时有一个坐标(x, y)。Mark Douglas作为上一届的猛汉王正在观看这场比赛,他希望得知场上有多少个「猛汉三角」。「猛汉三角」是指三个人uvw满足u压制vv压制ww压制u,且三人中至少有一人装填了「接击瓶」且至少有一人没有。由于场上尚存在一些不明了的压制关系,所以Mark希望知道可能的「猛汉三角」数量的最小值和最大值。

【输入格式】

输入文件名为mhw.in

输入第一行为三个正整数n m D

接下来n行每行两个正整数x y,表示装填了「接击瓶」的猛汉的坐标。

接下来m行每行两个正整数x y,表示没有装填「接击瓶」的猛汉的坐标。

可能有多个猛汉站在同一个位置。

【输出格式】

输出文件名为mhw.out

输出两个数min max,表示答案的最小值和最大值。

【样例输入与输出】

example_mhw1.in

example_mhw1.out

2 2 1

1 2

1 1

3 1

2 2

0 2

难度确实大!

首先我们将猛汉们分为两个阵营(记为黑色与白色)。我们一个猛汉三角就是形如a->c->b(a,b同阵营),然后在确定a,b之间的压制关系得到最小或者最大值。

我们以白色阵营为例。我们设cover[v]为v压制的对方阵营的数量,cover[v,u]为v,u共同压制的对方阵营的数量。maxans同理。

。对于cover[v,u],我们就算另一方阵营对的贡献就行了。如果一个猛汉被对面的k个人压制,那么他对的贡献就是

求cover数组可以用扫描+线段树。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<ctime>
#include<queue>
#define ll long long
#define N 100005 using namespace std;
inline ll Get() {ll x=,f=;char ch=getchar();while(ch<''||ch>'') {if(ch=='-') f=-;ch=getchar();}while(''<=ch&&ch<='') {x=(x<<)+(x<<)+ch-'';ch=getchar();}return x*f;} ll n,m,lim;
ll mn,mx;
ll cc;
ll d[N*];
ll cnt;
ll c[][N]; struct line {
ll x,op,col,id;
ll l,r;
bool operator <(const line &a)const {
if(x!=a.x) return x<a.x;
return op<a.op;
}
}st[N*]; struct tree {
ll l,r;
ll sum[];
}tr[N*]; void build(ll v,ll l,ll r) {
tr[v].l=l,tr[v].r=r;
if(l==r) return ;
ll mid=l+r>>;
build(v<<,l,mid),build(v<<|,mid+,r);
} void Modify(ll v,ll l,ll r,ll tag,ll f) {
if(tr[v].l>r||tr[v].r<l) return ;
if(l<=tr[v].l&&tr[v].r<=r) {
tr[v].sum[tag]+=f;
return ;
}
Modify(v<<,l,r,tag,f),Modify(v<<|,l,r,tag,f);
} ll query(ll v,ll pos,ll tag) {
if(tr[v].l>pos||tr[v].r<pos) return ;
if(tr[v].l==tr[v].r) return tr[v].sum[tag];
return query(v<<,pos,tag)+query(v<<|,pos,tag)+tr[v].sum[tag];
} void work() {
for(ll i=;i<=cnt;i++) {
if(st[i].op==-) {
Modify(,st[i].l,st[i].r,st[i].col,);
} else if(st[i].op==) {
c[st[i].col][st[i].id]=query(,st[i].l,st[i].col^);
} else {
Modify(,st[i].l,st[i].r,st[i].col,-);
}
}
} int main() {
n=Get(),m=Get(),lim=Get();
ll a,b,x,y;
for(ll i=;i<=n;i++) {
a=Get(),b=Get();
x=a+b,y=a-b;
st[++cnt]=(line) {x-lim,-,,i,y-lim,y+lim};
st[++cnt]=(line) {x,,,i,y};
st[++cnt]=(line) {x+lim,,,i,y-lim,y+lim};
d[++d[]]=y;
d[++d[]]=y+lim;
d[++d[]]=y-lim;
}
for(ll i=;i<=m;i++) {
a=Get(),b=Get();
x=a+b,y=a-b;
st[++cnt]=(line) {x-lim,-,,i,y-lim,y+lim};
st[++cnt]=(line) {x,,,i,y};
st[++cnt]=(line) {x+lim,,,i,y-lim,y+lim};
d[++d[]]=y;
d[++d[]]=y+lim;
d[++d[]]=y-lim;
}
sort(st+,st++cnt);
sort(d+,d++d[]);
cc=unique(d+,d++d[])-d;
for(ll i=;i<=cnt;i++) {
st[i].l=lower_bound(d+,d+cc,st[i].l)-d;
st[i].r=lower_bound(d+,d+cc,st[i].r)-d;
}
build(,,cc); work();
for(ll i=;i<=m;i++) c[][i]=n-c[][i];
sort(c[]+,c[]++n);
sort(c[]+,c[]++m); for(ll i=;i<=n;i++) {
mn+=(n-i)*c[][i];
mx+=(i-)*c[][i];
ll x=1ll*(m-c[][i])*(m-c[][i]-)/;
mn-=x,mx-=x;
}
for(ll i=;i<=m;i++) {
mn+=1ll*(m-i)*c[][i];
mx+=1ll*(i-)*c[][i];
ll x=1ll*(n-c[][i])*(n-c[][i]-)/;
mn-=x,mx-=x;
}
cout<<mn<<" "<<mx;
return ;
}

【九校3D2T3】世界第一的猛汉王的更多相关文章

  1. test20180922 世界第一的猛汉王

    题意 分析 由于异色点必有连边,所以一个点的covered减去两个点共有的covered就是可存在的环数,十分巧妙. 代码 #include <bits/stdc++.h> using L ...

  2. 九校联考 终&启

    one term's ending... class:12 school:130...130...130... 至今没有看到九校的排名,如果九校排名正常的话,那yyhs的学生也太可怕了...估计要三百 ...

  3. 中国人被“清朝GDP世界第一”忽悠了!

    中国人被"清朝GDP世界第一"忽悠了!"鸦片战争前的清朝GDP世界第一",这一说法在中国流传非常广.追根溯源,最早提出这一观点的似乎是英国学者麦迪森,他的一项猜 ...

  4. 牛客网 暑期ACM多校训练营(第一场)A.Monotonic Matrix-矩阵转化为格子路径的非降路径计数,Lindström-Gessel-Viennot引理-组合数学

    牛客网暑期ACM多校训练营(第一场) A.Monotonic Matrix 这个题就是给你一个n*m的矩阵,往里面填{0,1,2}这三种数,要求是Ai,j⩽Ai+1,j,Ai,j⩽Ai,j+1 ,问你 ...

  5. ZT:阿里合伙人发文:十年磨一剑,自研数据库终拿世界第一

    按:真正做技术的,就该这样. 以下为全文转载 (观察者网讯) 10月24日,阿里巴巴合伙人.高德总裁刘振飞在阿里云开发者社区发文,回忆从2009年启动“去IOE”工程到2019年OceanBase拿下 ...

  6. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  7. HDU6579 2019HDU多校训练赛第一场1002 (线性基)

    HDU6579 2019HDU多校训练赛第一场1002 (线性基) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题意: 两种操作 1.在序列末 ...

  8. 旷视6号员工范浩强:高二开始实习,“兼职”读姚班,25岁在CVPR斩获第四个世界第一...

    初来乍到,这个人说话容易让人觉得"狂". "我们将比赛结果提交上去,果不其然,是第一名的成绩."当他说出这句话的时候,表情没有一丝波澜,仿佛一切顺理成章. 他说 ...

  9. 天大福利!世界第一科技出版公司 Springer 免费开放 400 多本电子书!

    前几天,世界著名的科技期刊/图书出版公司施普林格(Springer)宣布:免费向公众开放 400 多本正版的电子书!! Springer 即施普林格出版社,于1842 年在德国柏林创立,20 世纪60 ...

随机推荐

  1. windows下mongodb基础玩法系列二CURD附加一

    windows下mongodb基础玩法系列 windows下mongodb基础玩法系列一介绍与安装 windows下mongodb基础玩法系列二CURD操作(创建.更新.读取和删除) windows下 ...

  2. [java]我的数据在哪里?——数据的内存模型

    在编写程序时,我们也许会有这样一个问题,我们编写的程序中的数据运行时,会保存在哪里呢?简单直接的回答可能是——内存.这个回答在多数情况下可能都是对的,但事实上并不准确,我们都知道内存,即随机访问存储器 ...

  3. LInux Crontab及命令

    定时任务(cron job)被用于安排那些需要被周期性执行的命令.利用它,你可以配置某些命令或者脚本,让它们在某个设定的时间内周期性地运行.cron 是 Linux 或者类 Unix 系统中最为实用的 ...

  4. Owin 自寄宿 asp.net web api

    http://owin.org/ Owin 定义了webserver和webapplication之间的标准接口,目标就是为了解耦webapplication对webserver的依赖, 就是说以后可 ...

  5. appendChild简单表格的增删改查

    ---恢复内容开始--- <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><hea ...

  6. url字符长度限制解决办法

    前段时间,同事往系统上传相关文档,发现输入失败,找到了我了. 开始以为数据库字段属性问题,修改后未解决随调试系统,发现没有走到后台程序,发现 ajax没有传值,各种测试问题情况,后来同事发现是url字 ...

  7. [PHP] 算法-快速排序的PHP实现

    快速排序: 1.基于二分的思想 2.第一个作为基准数,左右各一个指针,同时扫描,右边先走,找到比基准数小的停下 左边再走,找到比基准数大的停下,左右交换 3.当左右相遇的时候,把当前的和基准数调换,递 ...

  8. 2.C++中的bool类型,三目运算符,引用

    本章主要内容: 1)bool类型 2)三目运算符 3)引用 1.布尔型bool 在C++中,bool类型只有true(非0)和flase(0)两个值,且bool类型只占用了一个字节. 例如: #inc ...

  9. 【Spring】5、利用自定义注解在SpringMVC中实现自定义权限检查

    转自:http://www.tuicool.com/articles/6z2uIvU 先描述一下应用场景,基于Spring MVC的WEB程序,需要对每个Action进行权限判断,当前用户有权限则允许 ...

  10. Matlab forward Euler demo

    % forward Euler demo % take two steps in the solution of % dy/dt = y, y(0) = 1 % exact solution is y ...