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

这显然是两道题,求\(C\)是一个曼哈顿转切比雪夫后的线段树扫描线

求\(AB\),对向交换最大化和擦身而过最大化一定分别为最大值和最小值

对向交换最大化是每个点都对向交换

擦身而过最大化需要对向交换最小化,我们一次对向交换相当于交换任意两个数,所以就是每个置换圈的点数-1累加即可

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define space putchar(' ')
#define enter putchar('\n')
#define eps 1e-10
#define MAXN 100005
#define ba 47
//#define ivorysi
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 +c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
int N,K,tot;
int64 A,B,C,xst,xed;
int64 Min,Max;
int64 y[MAXN][2];
struct Point {
db x,y;
Point(db _x = 0.0,db _y = 0.0) {
x = _x;y = _y;
}
}P[MAXN * 10];
void getinsect(int a,int b) {
db k1 = 1.0 * (y[a][1] - y[a][0]) / (xed - xst);
db k2 = 1.0 * (y[b][1] - y[b][0]) / (xed - xst);
db t1 = y[a][0] - xst * k1;
db t2 = y[b][0] - xst * k2;
db X = (t2 - t1) / (k1 - k2);
db Y = k1 * X + t1;
P[++tot] = Point(X + Y,X - Y);
}
namespace task1 {
int id[MAXN],pos[MAXN],fa[MAXN],siz[MAXN];
int64 all;
set<pii > S;
int getfa(int u) {
return fa[u] == u ? u : fa[u] = getfa(fa[u]);
}
void Main() {
read(N);read(A);read(B);read(C);read(xst);read(xed);
for(int i = 1 ; i <= N ; ++i) read(y[i][0]);
for(int i = 1 ; i <= N ; ++i) {read(y[i][1]);id[i] = i;}
sort(id + 1,id + N + 1,[](int a,int b){return y[a][1] < y[b][1];});
for(int i = 1 ; i <= N ; ++i) pos[id[i]] = i;
for(int i = N ; i >= 1 ; --i) {
for(auto t : S) {
if(t.fi < pos[i]) {++all;getinsect(t.se,i);}
else break;
}
S.insert(mp(pos[i],i));
}
for(int i = 1 ; i <= N ; ++i) fa[i] = i;
for(int i = 1 ; i <= N ; ++i) {
if(getfa(pos[i]) != getfa(i)) fa[getfa(pos[i])] = getfa(i);
}
for(int i = 1 ; i <= N ; ++i) {
siz[getfa(i)]++;
}
int64 t = 0;
for(int i = 1 ; i <= N ; ++i) {
if(getfa(i) == i) {
t += siz[i] - 1;
}
}
Min = all * A;
Max = t * A + (all - t) * B;
if(Min > Max) swap(Min,Max);
}
};
namespace task2 {
struct qry_node {
int64 l,r;db y;
int on;
}qry[MAXN * 30];
struct node {
int l,r;
int cnt;
}tr[MAXN * 120];
int d,all;
int64 ans,val[MAXN * 30];
void build(int u,int l,int r) {
tr[u].l = l;tr[u].r = r;
tr[u].cnt = 0;
if(l == r) return;
int mid = (l + r) >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid + 1,r);
}
void Add(int u,int l,int r,int v) {
if(tr[u].l == l &&tr[u].r == r) {tr[u].cnt += v;return;}
int mid = (tr[u].l + tr[u].r) >> 1;
if(r <= mid) Add(u << 1,l,r,v);
else if(l > mid) Add(u << 1 | 1,l,r,v);
else {Add(u << 1,l,mid,v);Add( u << 1 | 1,mid + 1,r,v);}
}
bool Query(int u,int p) {
if(tr[u].cnt) return true;
if(tr[u].l == tr[u].r) return false;
int mid = (tr[u].l + tr[u].r) >> 1;
if(p <= mid) return Query(u << 1,p);
else return Query(u << 1 | 1,p);
}
void Main() {
read(K);
int64 p,q,r;
for(int i = 1 ; i <= K ; ++i) {
read(p);read(q);read(r);
int64 a = p + q,b = p - q;
qry[++all] = (qry_node){a - r,a + r,(db)b - r,1};
qry[++all] = (qry_node){a - r,a + r,b + r + 1e-12,-1};
val[++d] = a + r;val[++d] = a - r;
}
sort(val + 1,val + d + 1);
d = unique(val + 1,val + d + 1) - val - 1;
build(1,1,d);
for(int i = 1 ; i <= tot ; ++i) {
qry[++all] = (qry_node){0,i,P[i].y,0};
}
sort(qry + 1,qry + all + 1,[](qry_node a,qry_node b){return a.y < b.y || (a.y == b.y && a.on > b.on) ;});
for(int i = 1 ; i <= all ; ++i) {
if(qry[i].on == 0) {
int t = lower_bound(val + 1,val + d + 1,(int64)ceil(P[qry[i].r].x)) - val;
if(t <= d) ans += Query(1,t);
}
else {
int l = lower_bound(val + 1,val + d + 1,qry[i].l) - val;
int r = lower_bound(val + 1,val + d + 1,qry[i].r) - val;
++l;
Add(1,l,r,qry[i].on); }
}
Min += ans * C;
Max += ans * C;
}
};
void Solve() {
task1::Main();
task2::Main();
out(Min);space;out(Max);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

【LOJ】#3085. 「GXOI / GZOI2019」特技飞行的更多相关文章

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

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

  2. LOJ#3085. 「GXOI / GZOI2019」特技飞行(KDtree+坐标系变换)

    题面 传送门 前置芝士 请确定您会曼哈顿距离和切比雪夫距离之间的转换,以及\(KDtree\)对切比雪夫距离的操作 题解 我们发现\(AB\)和\(C\)没有任何关系,所以关于\(C\)可以直接暴力数 ...

  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. IntelliJ IDEA 运行项目的时候提示 Command line is too long 错误

    在 IntelliJ IDEA 项目运行的时候收到了下面的错误提示: Error running 'Application': Command line is too long. Shorten co ...

  2. 【原创】洛谷 LUOGU P3371 【模板】单源最短路径

    P3371 [模板]单源最短路径 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入输出格式 输入格式: 第一行包含三个整数N.M.S,分别表示点的个数.有向边的个数.出 ...

  3. DP-------bzoj2699 更新

    题目描述: 对于一个数列A[1..N],一种寻找最大值的方法是:依次枚举A[2]到A[N],如果A[i]比当前的A[1]值要大,那么就令A[1]=A[i],最后A[1]为所求最大值.假设所有数都在范围 ...

  4. 【CUDA 基础】5.6 线程束洗牌指令

    title: [CUDA 基础]5.6 线程束洗牌指令 categories: - CUDA - Freshman tags: - 线程束洗牌指令 toc: true date: 2018-06-06 ...

  5. SpringMVC——拦截器,过滤器实现登录拦截

    一.拦截器与过滤器的区别 1.过滤器 依赖于servlet容器.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次.使用过滤器的目的是用来做一些过滤操 ...

  6. Educational Codeforces Round 53 E. Segment Sum(数位DP)

    Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...

  7. PySpider的安装

    使用 Pip 安装,命令如下 pip install pyspider 命令执行完毕即可安装成功. 常见错误: Windows 下可能会出现这样的错误提示:Command "python s ...

  8. Django1.6 + jQuery Ajax + JSON 实现页面局部实时刷新

    最近微信公众帐号要扩展做一个签到系统,签到结果在一个网页上实时更新,即页面局部刷新.我想用Ajax来实现,之前公众帐号是用的Django搭的,我查找了Django的官方文档,没有封装Ajax.网上有各 ...

  9. Dubbo系列(一)dubbo的产生背景与原理概述

    一.Dubbo框架的产生背景        大规模服务化之前,应用只是通过RMI或Hessian等工具,简单的暴露和引用远程服务,通过配置服务的URL地址进行调用,通过F5等硬件进行负载均衡. (1) ...

  10. 本地访问weblogic控制台无反应,关闭linux操作系统防火墙

    有时候,我们在Linux操作系统上成功启动了weblogic,也查看了7001端口的状态是开启的.但是访问weblogic控制台没有反应,也没有报错. 使用 netstat -ano | grep 7 ...