题面

传送门

前置芝士

请确定您会曼哈顿距离和切比雪夫距离之间的转换,以及\(KDtree\)对切比雪夫距离的操作

题解

我们发现\(AB\)和\(C\)没有任何关系,所以关于\(C\)可以直接暴力数点

关于暴力数点,这个曼哈顿距离很麻烦,先把它转成切比雪夫距离,然后就是一个\(KDtree\)的经典操作了

容易发现交换操作的执行次数上界是\(tot\)(其中\(tot\)是交点个数),下界是\(n-cnt\)(其中\(cnt\)是原数组和飞过去之后的数组形成的一个置换,其中的轮换个数)

证明的话……上界应该是很好证明的,以样例那张图为例,红色的是一号的路线,不难发现它的路线肯定是一个类似于上凸壳的东西,也就是说它飞到右边之后绝对只会在最上面。然后把这一条东西删除,二号飞机的路线肯定是剩下来的上凸壳,也会在最上面……最后肯定保持相对顺序不变

下界的话,不同的置换之间是互不影响的,而设置换大小为\(k\),那么这里所需的最小交换次数为\(k-1\),所以总的次数为\(\sum (k-1)=n-cnt\)

关于为啥这里最小交换次数为\(k-1\)……因为它每一个交点都代表了一个逆序对,而交点里涵盖了所有的逆序对,所以交换逆序对的次数下界应该是\(k-1\)

//minamoto
#include<bits/stdc++.h>
#define R register
#define inf 0x3f3f3f3f
#define ll long long
#define inline __inline__ __attribute__((always_inline))
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=5e5+5;const double eps=1e-8;
inline double max(R double x,R double y){return x>y?x:y;}
inline double fabs(R double x){return x<-eps?-x:x;}
struct Point{
double p[2];
inline Point(){}
inline Point(R double xx,R double yy){p[0]=xx,p[1]=yy;}
}poi[N];
struct node;typedef node* ptr;
struct node{
ptr lc,rc;double mn[2],mx[2];Point p;bool flag,ok;
inline node();
inline void init(R Point pp){
p=pp;
mn[0]=mx[0]=pp.p[0],mn[1]=mx[1]=pp.p[1];
}
inline double mndis(R int x,R int y){
return max(max(fabs(x-mn[0]),fabs(x-mx[0])),max(fabs(y-mn[1]),fabs(y-mx[1])));
}
inline double dis(R int x,R int y){return max(fabs(x-p.p[0]),fabs(y-p.p[1]));}
}e[N],*rt;
inline node::node(){lc=rc=e,mn[0]=mn[1]=inf,mx[0]=mx[1]=-inf;}
void upd(ptr p,ptr s){
cmin(p->mn[0],s->mn[0]),cmin(p->mn[1],s->mn[1]);
cmax(p->mx[0],s->mx[0]),cmax(p->mx[1],s->mx[1]);
}
int WD,tot;
inline bool operator <(const Point &a,const Point &b){return a.p[WD]<b.p[WD];}
void build(ptr &p,int l,int r,int wd){
int mid=(l+r)>>1;p=(e+mid),WD=wd;
nth_element(poi+l,poi+mid,poi+r+1);
p->init(poi[mid]);
if(l<mid)build(p->lc,l,mid-1,wd^1),upd(p,p->lc);
if(mid<r)build(p->rc,mid+1,r,wd^1),upd(p,p->rc);
}
void update(ptr p,int x,int y,int d){
if(p==e||p->flag||x+d<p->mn[0]||x-d>p->mx[0]||y+d<p->mn[1]||y-d>p->mx[1])return;
if(p->mndis(x,y)-eps<=d)return p->flag=1,void();
if(!p->ok&&p->dis(x,y)-eps<=d)p->ok=1;
update(p->lc,x,y,d),update(p->rc,x,y,d);
}
int push(ptr p){
if(p->flag){
p->ok=1;
if(p->lc!=e)p->lc->flag=1,p->lc->ok=1;
if(p->rc!=e)p->rc->flag=1,p->rc->ok=1;
}
int res=p->ok;
if(p->lc!=e)res+=push(p->lc);
if(p->rc!=e)res+=push(p->rc);
return res;
}
int n,m,A,B,C,s,t,y[N],yy[N],id[N];double k[N],b[N],iv;
ll ans1,ans2,ans;bool vis[N];
set<pair<int,int> > si;
set<pair<int,int> >::iterator it;
inline bool cmp(const int &x,const int &y){return yy[x]<yy[y];}
int main(){
// freopen("testdata.in","r",stdin);
n=read(),A=read(),B=read(),C=read(),s=read(),t=read(),iv=1.0/(t-s);
fp(i,1,n)y[i]=read();fp(i,1,n)yy[i]=read();
fp(i,1,n)k[i]=(yy[i]-y[i])*iv,b[i]=y[i]-k[i]*s;
fd(i,n,1){
for(it=si.begin();it!=si.end()&&it->first<yy[i];++it){
R int j=it->second;
double tx=(b[j]-b[i])/(k[i]-k[j]);
double ty=k[i]*tx+b[i];
double x=tx+ty,y=tx-ty;
poi[++tot]=Point(x,y);
}
si.insert(make_pair(yy[i],i));
}
build(rt,1,tot,0);
m=read();
for(R int x,y,dx,dy,d;m;--m){
dx=read(),dy=read(),d=read(),
x=dx+dy,y=dx-dy;
update(rt,x,y,d);
}
ans=push(rt)*C,ans1=ans+tot*A;
fp(i,1,n)id[i]=i;
sort(id+1,id+1+n,cmp);
int res=0;
fp(i,1,n)if(!vis[i]){
++res;
for(R int j=i;!vis[j];j=id[j])vis[j]=1;
}
ans2=ans+(n-res)*A+(tot-n+res)*B;
if(ans1>ans2)swap(ans1,ans2);
printf("%lld %lld\n",ans1,ans2);
return 0;
}

LOJ#3085. 「GXOI / GZOI2019」特技飞行(KDtree+坐标系变换)的更多相关文章

  1. Loj #3085. 「GXOI / GZOI2019」特技飞行

    Loj #3085. 「GXOI / GZOI2019」特技飞行 题目描述 公元 \(9012\) 年,Z 市的航空基地计划举行一场特技飞行表演.表演的场地可以看作一个二维平面直角坐标系,其中横坐标代 ...

  2. 【LOJ】#3085. 「GXOI / GZOI2019」特技飞行

    LOJ#3085. 「GXOI / GZOI2019」特技飞行 这显然是两道题,求\(C\)是一个曼哈顿转切比雪夫后的线段树扫描线 求\(AB\),对向交换最大化和擦身而过最大化一定分别为最大值和最小 ...

  3. LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位

    #3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...

  4. LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)

    题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y ...

  5. LOJ#3087. 「GXOI / GZOI2019」旅行者(最短路)

    题面 传送门 题解 以所有的感兴趣的城市为起点,我们正着和反着各跑一边多源最短路.记\(c_{0/1,i}\)分别表示正图/反图中离\(i\)最近的起点,那么对于每条边\((u,v,w)\),如果\( ...

  6. LOJ#3086. 「GXOI / GZOI2019」逼死强迫症(矩阵快速幂)

    题面 传送门 题解 先考虑全都放\(1\times 2\)的方块的方案,设防\(i\)列的方案数为\(g_i\),容易推出\(g_i=g_{i-1}+g_{i-2}\),边界条件为\(g_0=g_1= ...

  7. LOJ#3084. 「GXOI / GZOI2019」宝牌一大堆(递推)

    题面 传送门 题解 为什么又是麻将啊啊啊!而且还是我最讨厌的爆搜类\(dp\)-- 首先国士无双和七对子是可以直接搞掉的,关键是剩下的,可以看成\(1\)个雀头加\(4\)个杠子或面子 直接\(dp\ ...

  8. LOJ#3083. 「GXOI / GZOI2019」与或和(单调栈)

    题面 传送门 题解 按位考虑贡献,如果\(mp[i][j]\)这一位为\(1\)就设为\(1\)否则设为\(0\),对\(or\)的贡献就是全为\(1\)的子矩阵个数,对\(and\)的贡献就是总矩阵 ...

  9. 「GXOI / GZOI2019」简要题解

    「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...

随机推荐

  1. leetcode 7 reverse integer 反转整数

    描述: 给定32位整数,反转,如321转成123. 解决: 关键是溢出检测: int reverse(int x) { ; int temp; while (x) { temp = ret * + x ...

  2. Visual studio 2017编译 boost

    下载: https://www.boost.org/   或者 https://dl.bintray.com/boostorg/release/1.66.0/source/ 下载完成以后解压到自己想要 ...

  3. MongoDB--CSharp Driver Quickstart .

    原文链接 http://www.mongodb.org/display/DOCS/CSharp+Driver+Quickstart?showComments=true&showCommentA ...

  4. mybatis框架入门程序:演示通过mybatis实现数据库的模糊查询操作

    1. mybatis的基本准备操作见我的上一篇博文:https://www.cnblogs.com/wyhluckdog/p/10149480.html 2. 根据用户名查询用户信息: (1)映射文件 ...

  5. marioTcp

    https://github.com/nicholaszj/marioTcp MarioTCP MarioTCP 是使用libevent模型来建立的一个性能强大的TCP服务器. 1:Getting S ...

  6. iPhone X 的“刘海”正是苹果的品牌象征

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 在iPhone X发布活动结束之后,关于其在屏幕顶端独特的“刘海”设计,引起了不少人的讨论.其实,这 ...

  7. Spring MVC的handlermapping之请求分发如何找到正确的Handler(BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping)

    本文讲的是Spring MVC如何找到正确的handler, 前面请求具体怎么进入到下面的方法,不再细说. 大概就是Spring mvc通过servlet拦截请求,实现doService方法,然后进入 ...

  8. jquery.cookie 介绍 和 用法

    1.依赖jQuery库 2.浏览器兼容性情况 3.下载 官方github:https://github.com/carhartl/jquery-cookie 4.使用 创建一个整站cookie $.c ...

  9. Linux服务器上如何设置MySQL的max_allowed_packe

    mysql根据配置文件会限制server接受的数据包大小. 有时候大的插入和更新会被max_allowed_packet 参数限制掉,导致失败. 查看目前配置  show VARIABLES like ...

  10. C语言 void 万能类型

    C中 void类型其实是一种万能类型, 也就是说 我们的 void 可以代表任意一种类型,也就是说他的范围要比具体的一种类型要宽广, 例如: int *p = NULL;void *ptr = p; ...