luogu P5302 [GXOI/GZOI2019]特技飞行
强行二合一可还行
首先\(c\)的贡献是不会变的,先考虑求出多少交点被矩形覆盖,交点的话可以按左端点纵坐标从下到上顺序枚举一条线段,然后维护右端点纵坐标的set,把之前处理过线段的右端点放进set里,然后所有 右端点在当前线段右端点上方的线段 都是和当前线段有交点的,直接算出来,并且这样算不会算重
本题中的矩形是斜着的,但是如果我们把所有点绕原点顺时针转\(45^\circ\),那么矩形的四边都会和坐标轴平行,我们可以直接考虑每个点是否被矩形覆盖,把坐标离散化,然后套扫描线扫横坐标,用树状数组维护每个纵坐标是否被覆盖,扫到某个点就直接查对应\(y\)坐标是否有值就行了
然后考虑\(a,b\),最大值最小值一定是一个尽量多用「对向交换」,一个尽量多用「擦身而过」,而「对向交换」不会改变飞机在纵坐标的相对顺序,所以可以全部用「对向交换」;然后尽量多用「擦身而过」等价于尽量少用「对向交换」.考虑把左端点纵坐标按大小编号,右端点纵坐标也按大小编号,然后左端点编号\(i\)向对应的右端点编号\(j\)连边,我们可以得到若干个环,因为要使得最后的相对顺序和开始的相对顺序一样,也就是要用最少的操作数把那些环转化成\(n\)个自环,而每次「对向交换」可以对应到交换两点连出去的点,可以发现一个大小为\(sz\)的环只要操作\(sz-1\)次,所以最少次数就是\(\sum_{circle} sz-1\),等价于\(n-\)环的个数
// luogu-judger-enable-o2
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<set>
#define LL long long
#define db double
using namespace std;
const int N=1e5+10;
const db sb=1.0/sqrt(2),eps=1e-8;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
struct nn
{
db x;
nn(){}
nn(db nx){x=nx;}
bool operator < (const nn &bb) const {return x<bb.x;}
bool operator == (const nn &bb) const {return fabs(x-bb.x)<eps;}
}bk[N*7];
struct point
{
db x,y;
point(){}
point(db nx,db ny){x=nx,y=ny;}
bool operator < (const point &bb) const {return x!=bb.x?x<bb.x:y<bb.y;}
void rot()
{
db xx=x,yy=y;
x=sb*xx+sb*yy,y=sb*yy-sb*xx;
}
}p[N*5],sd;
set<point> s1;
set<point>::iterator i1;
struct matrix
{
point a,b;
bool operator < (const matrix &bb) const {return bb.a<a;}
}qq[N];
priority_queue<matrix> hp;
bool cmp(matrix aa,matrix bb){return aa.a<bb.a;}
int n,A,B,C,sx,tx,a[N],aa[N],b[N],bb[N],m,pt,ttx,tty,cnt,mi;
db ln[N];
point jiao(int i,int j)
{
db x=aa[a[i]]-aa[a[j]],y=bb[b[j]]-bb[b[i]];
return point((db)sx+(db)(tx-sx)*x/(x+y),(db)aa[a[i]]+(db)(bb[b[i]]-aa[a[i]])*x/(x+y));
}
int c[N*7];
void ad(int x,int y){while(x<=tty){c[x]+=y,x+=x&(-x);}}
int gsm(int x){int an=0;while(x){an+=c[x],x-=x&(-x);}return an;}
int ff[N];
int findf(int x){return ff[x]==x?x:ff[x]=findf(ff[x]);}
LL a1,a2;
int main()
{
n=rd(),A=rd(),B=rd(),C=rd(),sx=rd(),tx=rd();
for(int i=1;i<=n;++i) a[i]=aa[i]=rd();
sort(aa+1,aa+n+1);
for(int i=1;i<=n;++i) a[i]=lower_bound(aa+1,aa+n+1,a[i])-aa;
for(int i=1;i<=n;++i) b[i]=bb[i]=rd();
sort(bb+1,bb+n+1);
for(int i=1;i<=n;++i) b[i]=lower_bound(bb+1,bb+n+1,b[i])-bb;
for(int i=1;i<=n;++i)
{
s1.insert(point(bb[b[i]],i));
i1=s1.upper_bound(point(bb[b[i]],i));
for(;i1!=s1.end();++i1)
{
int j=(int)((*i1).y+0.5);
p[++pt]=jiao(i,j);
p[pt].rot();
}
}
m=rd();
for(int i=1;i<=m;++i)
{
db x=rd(),y=rd();
sd=point(x,y),ln[i]=(db)rd()/sb;
sd.rot();
qq[i]=(matrix){point(sd.x-ln[i]/2,sd.x+ln[i]/2),point(sd.y-ln[i]/2,sd.y+ln[i]/2)};
}
bk[++ttx]=nn(1e18);
for(int i=1;i<=pt;++i) bk[++ttx]=nn(p[i].x);
for(int i=1;i<=m;++i) bk[++ttx]=nn(qq[i].a.x),bk[++ttx]=nn(qq[i].a.y);
sort(bk+1,bk+ttx+1),ttx=unique(bk+1,bk+ttx+1)-bk-1;
for(int i=1;i<=pt;++i) p[i].x=upper_bound(bk+1,bk+ttx+1,nn(p[i].x))-bk-1;
for(int i=1;i<=m;++i) qq[i].a.x=upper_bound(bk+1,bk+ttx+1,nn(qq[i].a.x))-bk-1,qq[i].a.y=upper_bound(bk+1,bk+ttx+1,nn(qq[i].a.y))-bk-1;
bk[++tty]=nn(1e18);
for(int i=1;i<=pt;++i) bk[++tty]=nn(p[i].y);
for(int i=1;i<=m;++i) bk[++tty]=nn(qq[i].b.x),bk[++tty]=nn(qq[i].b.y);
sort(bk+1,bk+tty+1),tty=unique(bk+1,bk+tty+1)-bk-1;
for(int i=1;i<=pt;++i) p[i].y=upper_bound(bk+1,bk+tty+1,nn(p[i].y))-bk-1;
for(int i=1;i<=m;++i) qq[i].b.x=upper_bound(bk+1,bk+tty+1,nn(qq[i].b.x))-bk-1,qq[i].b.y=upper_bound(bk+1,bk+tty+1,nn(qq[i].b.y))-bk-1;
sort(p+1,p+pt+1);
sort(qq+1,qq+m+1,cmp);
for(int i=1,j=1,k=1;i<=ttx&&k<=pt;++i)
{
int ll,rr;
while(j<=m&&(int)qq[j].a.x<=i)
{
ll=qq[j].b.x,rr=qq[j].b.y;
ad(ll,1),ad(rr+1,-1);
hp.push((matrix){point(qq[j].a.y,0),point(ll,rr)});
++j;
}
while(k<=pt&&(int)p[k].x<=i)
{
cnt+=(bool)gsm(p[k].y);
++k;
}
while(!hp.empty()&&(int)hp.top().a.x<=i)
{
ll=hp.top().b.x,rr=hp.top().b.y;
ad(ll,-1),ad(rr+1,1);
hp.pop();
}
}
for(int i=1;i<=n;++i) ff[i]=i;
for(int i=1;i<=n;++i) ff[findf(a[i])]=findf(b[i]);
mi=n;
for(int i=1;i<=n;++i) mi-=findf(i)==i;
a1=1ll*cnt*C+1ll*pt*A,a2=1ll*cnt*C+1ll*mi*A+1ll*(pt-mi)*B;
if(a1>a2) swap(a1,a2);
printf("%lld %lld\n",a1,a2);
return 0;
}
luogu P5302 [GXOI/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 p3918[国家集训队]特技飞行 贪心
开始没看出来是贪心,一度以为是动态规划,还是太弱了呀-.. 不难分析出,两个相同的飞行动作之间夹一个相同的动作是多余的,所以就贪心一下,按Ci从大到小排序,依次加到左右两端点,知道加不了为止. 代码: ...
- luogu P5305 [GXOI/GZOI2019]旧词
传送门 先考虑\(k=1\),一个点的深度就是到根节点的路径上的点的个数,所以\(lca(x,y)\)的深度就是\(x\)和\(y\)到根路径的交集路径上的点的个数,那么对于一个询问,我们可以对每个点 ...
- luogu P5304 [GXOI/GZOI2019]旅行者
传送门 所以这个\(5s\)是SMG 暴力是枚举每一个点跑最短路,然后有一个很拿衣服幼稚的想法,就是把所有给出的关键点当出发点,都丢到队列里,求最短路的时候如果当前点\(x\)某个相邻的点\(y\)是 ...
- luogu P5303 [GXOI/GZOI2019]逼死强迫症
传送门 只有两行,考虑递推,设\(f_i\)为没有那两个\(1*1\)的,前\(i\)列的方案,可以发现一次可以放一个竖的或两个横的,也就是\(f_i=f_{i-1}+f_{i-2}\) 再设\(g_ ...
- luogu P5300 [GXOI/GZOI2019]与或和
传送门 题目涉及按位与以及按位或运算,所以可以拆位考虑,枚举某个二进制位,然后某个位置如果那个数的第\(i\)位是\(0\)就放\(0\),否则放\(1\),这一位的贡献就是位运算后值为\(1\)的子 ...
- luogu P5301 [GXOI/GZOI2019]宝牌一大堆
传送门 wdnm又是打麻将 首先国土无双可以直接枚举哪种牌用了\(2\)次算贡献,然后\(7\)个对子可以把每种牌的对子贡献排序,取最大的\(7\)个,剩下的牌直接暴力枚举是不行的,考虑dp,设\(f ...
随机推荐
- 我为什么要花大力气从头研发智表ZCELL(一个仿EXCEL的前端插件)
为什么呢,一个前端用的,类似EXCEL的操作的JS 插件,从头研发真的有必要吗?可能你会觉得没有必要吧,其实我自己也问过自己好多遍.因为业界有更加强大的spreadjs,也有比较轻型的JEXCEL,自 ...
- 好程序员web前端分享想要学习前端需要学那些课程
好程序员web前端分享想要学习前端需要学那些课程,仔细思考了一下如何回答好这个话题,其实前端是一个涵盖面非常之广泛的一个职位,所需知识体系非常庞杂,与传统语言“想要精一行,必先通一门” 有很大差别, ...
- 对多条件进行组合,生成笛卡尔积的用例集合的python代码实现
做专项测试需要对一些因素进行组合的测试,这里组合起来后数据量可能很大,我们可以用python来代劳 代码有优化空间,目前先用着. ************************代码开始******* ...
- “百度杯”CTF比赛 十月场 Hash 复现
进入题后老套路得到两个关键: 1.$hash=md5($sign.$key);the length of $sign is 8 2.key=123&hash=f9109d5f83921a551 ...
- [解读REST] 2.REST用来干什么的?
衔接上文[解读REST] 1.REST的起源,介绍了REST的诞生背景.每当笔者遇到一个新事物的想去了解的时候,总是会问上自己第一个问题,这个新事物是干什么用的?在解释我所理解的REST这个过程中也不 ...
- 转载:教你分分钟搞定Docker私有仓库Registry
一.什么是Docker私有仓库Registry 官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去.但是,有时候我们的服务器无法 ...
- Echarts学习之路2(基本配置项)
title:标题组件,包含主标题和副标题. title:{ text:"",//主标题 link:"",//主标题文本超链接 target:"&quo ...
- Spring Cloud Netflix vs Spring Cloud Alibaba
Spring Cloud Netflixhttps://spring.io/projects/spring-cloud-netflix spring-cloud-alibaba/README-zh.m ...
- C#技巧记录——持续更新
作为一名非主修C#的程序员,在此记录下学习与工作中C#的有用内容,持续更新 对类型进行约束,class指定了类型必须是引用类型,new()指定了类型必须具有一个无参的构造函数 where T : cl ...
- SpringCloud---网关概念、Zuul项目搭建(六)
SpringCloud---网关概念.Zuul项目搭建(六) 一.网关概念 1.什么是路由网关 网关是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能 提供路由请求.鉴权.监控. ...