[GX/GZOI2019]特技飞行(扫描线+置换)
感觉是6题中最难的一题,其实这题是一个二合一:
第一问:给定平面上若干点和k个关键点,关键点覆盖一个45°倾斜的正方形范围r,求有多少点被至少一个关键点覆盖。这个可以曼哈顿转切比雪夫距离,然后再扫描线求解,复杂度O(nlogn)
第二问:求最少和最多有多少次擦肩而过。显然每个交点都可以做对向交换,这是最少擦肩而过的次数。最多的次数,假设全部擦肩而过得到排列p,对向交换实际上是交换两元素位置,用最小交换次数还原排列即可。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>pii;
const int N=5e5+;
int n,m,a,b,c,x0,x1,ans1,ans2,tot,cnt,ans,C[N<<],y[N][],f[N],vis[N];
double d[N<<];
set<pii>S;
struct node{double x,y;int v,p;}p[N<<];
bool operator<(node a,node b){return a.x<b.x;}
node calc(int i,int j)
{
int y1=y[j][]-y[i][],y2=y[i][]-y[j][];
double k=1.0*y1/(y1+y2),xl=1.0*x0+k*(x1-x0),yl=1.0*y[i][]+k*(y[i][]-y[i][]);
d[++cnt]=xl-yl;
return(node){xl+yl,xl-yl,,};
}
bool cmp(node a,node b){return fabs(a.x-b.x)<1e-?a.y<b.y:a.x<b.x;}
void add(int x,int v){while(x<=cnt)C[x]+=v,x+=x&-x;}
int query(int x){int ret=;while(x)ret+=C[x],x-=x&-x;return ret;}
bool cmp1(int a,int b){return y[a][]<y[b][];}
int main()
{
scanf("%d%d%d%d%d%d",&n,&a,&b,&c,&x0,&x1);
for(int i=;i<=n;i++)scanf("%d",&y[i][]);
for(int i=;i<=n;i++)scanf("%d",&y[i][]);
for(int i=;i<=n;i++)
{
pii u=make_pair(y[i][],i);
set<pii>::iterator it=S.lower_bound(u);
while(it!=S.end())p[++tot]=calc(it->second,i),it++;
S.insert(u);
}
int sum=tot;scanf("%d",&m);
for(int i=,x,y,z;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
d[++cnt]=x-y+z,d[++cnt]=x-y-z;
p[++tot]=(node){x+y+z,x-y+z,,};
p[++tot]=(node){x+y+z,x-y-z,-,};
p[++tot]=(node){x+y-z,x-y+z,-,};
p[++tot]=(node){x+y-z,x-y-z,,};
}
sort(p+,p+tot+);
sort(d+,d+cnt+);
cnt=unique(d+,d+cnt+)-d-;
for(int i=;i<=tot;i++)p[i].p=upper_bound(d+,d+cnt+,p[i].y-1e-)-d;
sort(p+,p+tot+,cmp);
for(int i=;i<=tot;i++)if(p[i].v)add(p[i].p,p[i].v);else ans+=query(p[i].p)>;
ans1=ans*c+sum*a;
for(int i=;i<=n;i++)f[i]=i;
sort(f+,f+n+,cmp1);
int num=n;
for(int i=;i<=n;i++)
if(!vis[i])
{
num--;
for(int j=i;!vis[j];j=f[j])vis[j]=;
}
ans2=ans1+(b-a)*(sum-num);
if(ans1>ans2)swap(ans1,ans2);
printf("%d %d",ans1,ans2);
}
[GX/GZOI2019]特技飞行(扫描线+置换)的更多相关文章
- P5302 [GXOI/GZOI2019]特技飞行
题目地址:P5302 [GXOI/GZOI2019]特技飞行 这里是官方题解(by lydrainbowcat) 题意 给 \(10^5\) 条直线,给 \(x = st\) 和 \(x = ed\) ...
- 题解-GXOI/GZOI2019 特技飞行
Problem loj3085 bzoj不放题面差评 题意概要:给出两条竖直直线,再给出 \(n\) 架飞机的初始航线:一条接通这两条直线的线段,保证航线交点不在两条直线上.现要求安排所有飞机在航线相 ...
- [GXOI/GZOI2019]特技飞行
题目链接 [https://www.luogu.org/problem/P5302] 思路:这道题可以说是两道题的合并.注意到\(c\)的分数与 \(a\)和\(b\)的分数 无关,也就是说可以分成两 ...
- luogu P5302 [GXOI/GZOI2019]特技飞行
传送门 强行二合一可还行 首先\(c\)的贡献是不会变的,先考虑求出多少交点被矩形覆盖,交点的话可以按左端点纵坐标从下到上顺序枚举一条线段,然后维护右端点纵坐标的set,把之前处理过线段的右端点放进s ...
- Loj #3085. 「GXOI / GZOI2019」特技飞行
Loj #3085. 「GXOI / GZOI2019」特技飞行 题目描述 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代 ...
- 【LOJ】#3085. 「GXOI / GZOI2019」特技飞行
LOJ#3085. 「GXOI / GZOI2019」特技飞行 这显然是两道题,求\(C\)是一个曼哈顿转切比雪夫后的线段树扫描线 求\(AB\),对向交换最大化和擦身而过最大化一定分别为最大值和最小 ...
- 【GZOI 2019】特技飞行
Problem Description 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代表着水平位置,纵坐标代表着飞行高度. ...
- BZOJ2697: 特技飞行
2697: 特技飞行 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 607 Solved: 363[Submit][Status] Descript ...
- GX/GZOI2019 day2 解题报告
GX/GZOI2019 day2 解题报告 题目链接 逼死强迫症 旅行者 旧词 t1 逼死强迫症 显然地,记 \(f(i)\) 为长度为 \(i\) 的木板的答案,可得: \(\\\) \[f(i)= ...
随机推荐
- 十四、CI框架之数据库以参数形式插入操作
一.代码如下: 二.使用浏览器打开 三.我们查看数据库,被成功插入数据 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.
- C 的printf函数
头文件 #include <stdio.h> printf函数是最常用的格式化输出函数,原型为:int printf(char *format,......); printf函数会根据参数 ...
- Comet OJ - Contest #15(B: 当我们同心在一起 )
题目链接 题目描述 平面上有 nn 个坐标相异的点,请问当中有多少组非共线的三个点,这三个点的 外心 也在这 nn 个点之中? 输入描述 第一行有一个正整数 nn 代表平面上的点数. 接下来有 nn ...
- SAP_SD常用事务代码
1.创建/修改/显示销售订单:VA01/VA02/VA03 2.根据销售订单创建交货单:VL01N 3.修改/显示交货单:VL02N/VL03N 4.交货单发货过账:VL02N 5.发货过账冲销:VL ...
- Vue 指令 v-text v-html
有三个指令达到的效果是一样的 {{JS表达式}} 差值表达式 v-text="JS表达式" v-html="JS表达式" //会自动解析tag js表达式 ...
- [Python ]小波变化库——Pywalvets 学习笔记
[Python ]小波变化库——Pywalvets 学习笔记 2017年03月20日 14:04:35 SNII_629 阅读数:24776 标签: python库pywavelets小波变换 更多 ...
- sql优化从300秒到7秒
原始sql select b.jd 街道,b.rglm 楼宇,zzrl 楼宇编号,count(oname) 入楼企业总数, (select count(oname) from ${tablename} ...
- [APIO2018]铁人两项(圆方树)
过了14个月再重新看这题,发现圆方树从来就没有写过.然后写了这题发现自己APIO2018打铁的原因竟然是没开long long,将树的部分的O(n)写挂了(爆int),毕竟去年APIO时我啥都不会,连 ...
- 201771010123汪慧和《面向对象程序设计Java》第二周学习总结
一.理论知识部分 1.标识符由字母.下划线.美元符号和数字组成, 且第一个符号不能为数字.标识符可用作: 类名.变量名.方法名.数组名.文件名等.第二部分:理论知识学习部分 2.关键字就是Java语言 ...
- 跟踪LinkedList源码,通过分析双向链表实现原理,自定义一个双向链表
1.LinkedList实现的基本原理 LinkedList是一个双向链表,它主要有两个表示头尾节点的成员变量first .last,因其有头尾两个节点,所以从头或从尾操作数据都非常容易快捷.Lin ...