「清新题精讲」CF249D - Donkey and Stars

2024-05-29 22:44

本文主要是介绍「清新题精讲」CF249D - Donkey and Stars,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

更好的阅读体验

CF249D - Donkey and Stars

Description

给定 n n n 个点 ( x i , y i ) (x_i,y_i) (xi,yi) a , b , c , d a,b,c,d a,b,c,d,求出最多有多少个点依次连接而成的折线上线段的斜率在 ( a b , c d ) (\frac{a}{b},\frac{c}{d}) (ba,dc),其中第 1 1 1 条折线的起点必须在坐标原点且坐标原点不计入答案。

1 ≤ n ≤ 1 0 5 , 0 ≤ a , b , c , d ≤ 1 0 5 , 1 ≤ x i , y i ≤ 1 0 5 1\le n\le 10^5,0\le a,b,c,d\le 10^5,1\le x_i,y_i\le 10^5 1n105,0a,b,c,d105,1xi,yi105

Solution

不难想到通过 DP 来求解,暴力 DP 时间复杂度为 O ( n 2 ) O(n^2) O(n2),必然是过不去的。所以,考虑对于点 i i i,能够与 i i i 连线的点 j j j 应满足哪些性质?

i i i 点位于 j j j 点的右上方,则有 a b < y i − y j x i − x j < c d \frac{a}{b}< \frac{y_i-y_j}{x_i-x_j}<\frac{c}{d} ba<xixjyiyj<dc,通过简单的解不等式可以得到 b y j − a x j < b y i − a x i by_j-ax_j<by_i-ax_i byjaxj<byiaxi 以及 d y i − c x i < d y j − c x j dy_i-cx_i<dy_j-cx_j dyicxi<dyjcxj,满足该条件的即可转移。注意到,这其实就是二维偏序,所以只需要令数组按 b y i − a x i by_i-ax_i byiaxi 排序,求最长下降子序列。不过,该题要求必须从原点开始,考虑从后往前枚举,这样相当于求最长上升子序列,最后输出在原点结束的最长长度即可(不要忘记 − 1 -1 1)。

综上所述,可以做到 O ( n log ⁡ n ) O(n\log n) O(nlogn)

Code

#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;const int N = 1e5 + 10;int n, a, b, c, d;
PII pnt[N];
int f[N];
std::vector<int> dct;
struct fenwick {int tr[N];void add(int x, int d) { for (int i = x; i < N; i += (i & -i)) tr[i] = max(tr[i], d); }int sum(int x) {int res = 0;if (!x) return res;for (int i = x; i; i -= (i & -i)) res = max(res, tr[i]);return res;}
}cnt;int find(int x) {return lower_bound(dct.begin(), dct.end(), x) - dct.begin() + 1;
}signed main() {scanf("%lld\n%lld/%lld %lld/%lld", &n, &a, &b, &c, &d);for (int i = 1; i <= n; i ++)scanf("%lld%lld", &pnt[i].fi, &pnt[i].se), dct.push_back(d * pnt[i].se - c * pnt[i].fi);pnt[0] = {0, 0};sort(dct.begin(), dct.end());dct.erase(unique(dct.begin(), dct.end()), dct.end());sort(pnt, pnt + 1 + n, [&](PII tmp1, PII tmp2) {return tmp1.se * b - tmp1.fi * a < tmp2.se * b - tmp2.fi * a;});for (int i = n, j = n; i >= 0; i --) {while (j > i && pnt[j].se * b - pnt[j].fi * a != pnt[i].se * b - pnt[i].fi * a)cnt.add(find(pnt[j].se * d - pnt[j].fi * c), f[j]), j --;f[i] = cnt.sum(find(pnt[i].se * d - pnt[i].fi * c) - 1) + 1;}for (int i = 0; i <= n; i ++)if (pnt[i] == make_pair(0ll, 0ll)) {cout << f[i] - 1 << endl;return 0;}return 0;}

这篇关于「清新题精讲」CF249D - Donkey and Stars的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014838

相关文章

iOS CAShapeLayer精讲

CAShapeLayer继承自CALayer,因此,可使用CALayer的所有属性。但是,CAShapeLayer需要和贝塞尔曲线配合使用才有意义。 关于UIBezierPath,请阅读文章iOS UIBezierPth精讲 基本知识 看看官方说明: /* The shape layer draws a cubic Bezier spline in its coordinate

GitHub 上 Stars 数量最多的 8 个开源 CRUD 项目

继续我们的 GitHub Star 系列!这是本系列的第四篇文章,之前的内容: GitHub Star 数量前 12 的开源无代码工具GitHub Star 数量前 15 的开源低代码项目GitHub Star 数量前 11 的开源内部工具 本期我们来盘点 CRUD 项目。在软件开发中,CRUD(创建、读取、更新、删除)是基本的数据操作,它们构成了大多数应用程序与数据交互的核心。 (如果你对

每日一题,零基础入门FPGA——工程师在线精讲,直播预告

题目传送门:F学社 zzfpga.com/StudentPlatform/Sheet/QuestionBankhttp://zzfpga.com/StudentPlatform/Sheet/QuestionBank 【第Ⅰ期题目 * 5】 请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。 【第Ⅰ期题目 * 4】 请设计一个0-9的十进制计数器,要求带同步

【精讲】PCIe基础篇——Non-Prefetchable Prefetchable MMIO

MMIO 有两种, Non-Prefetchable MMIO:非预取内存空间 Prefetchable MMIO :可预取内存空间 Prefetchable MMIO:将MMIO的一个区域设置为可预取的,允许CPU提前获取该区域中的数据,以预测请求者在不久的将来可能需要比实际请求更多的数据。对数据进行这种小规模缓存是安全的,因为读取数据不会改变目标设备上的任何状态信息。也就是说,

【精讲】PCIe基础篇——Memory IO 地址空间

在早期的PC中,IO设备中的内部寄存器/存储是通过IO地址空间(由Intel定义)来访问的。然而,由于与IO地址空间相关的一些限制和不良影响(我们在这里不讨论),IO地址空间很快就失去了软件和硬件供应商的青睐。这导致IO设备的内部寄存器/存储被映射到内存地址空间(通常称为Memory mapped IO,或MMIO)。然而,由于早期的软件是使用IC地址空间来访问IO设备上的内部寄存

【精讲】PCIe基础篇——BAR(Base Address Register)详解

一、为什么需要BAR         系统中的每个设备中,对地址空间的大小和访问方式可能有不同的需求,例如,一个设备可能有256字节的内部寄存器/存储,应该可以通过IO地址空间访问,而另一个设备可能有16KB的内部寄存器/存储,应该可以通过基于MMIO的设备访问。哪些地址应该使用哪种方式(IO或Memory)来访问它们的内部位置,这是系统软件(即BIOS和OS内核)的工作。因此设备必须为系统软件

算法工程师第五十一天(dijkstra(堆优化版)精讲 Bellman_ford 算法精讲)

参考文献 代码随想录 一、参加科学大会 题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。 小明的起点是第一个车站,终点是最后一个车站。然而,途中的各个车站之间的道路状况、交通拥堵程度以及可能的自然因素(如天气变化)等不同,这些因素都会影响每条路径的通行时间。 小明希望能选择一条花费时间最少的路线,以确保他能够尽快到达目的地。 输入描述 第一行包

学习笔记(02):全新 PowerDesigner 16.6 数据库设计与建模(精讲版)-索引

立即学习:https://edu.csdn.net/course/play/24751/280492?utm_source=blogtoedu 索引 1.组合索引 2.唯一索引 3.聚簇索引 4.非聚簇索引

MATLAB算法实战应用案例精讲-【采样路径规划算法】RRT算法(附MATLAB源码)

目录 前言 算法原理 算法流程 算法流程图 优缺点 伪代码 知识拓展 基于BINN算法的CCPP全路径覆盖算法 1、CCPP整体算法 2. 核心代码 代码 1.MATLAB   前言 RRT算法是适用于高维空间,通过对状态空间中的采样点进行碰撞检测,避免了对空间的建模,较好的处理带有非完整约束的路径规划问题,有效的解决了高维空间和复杂约束的路径规划问题。该算法

MATLAB算法实战应用案例精讲-【人工智能】迁移学习(附python代码实现)

目录 前言 高频面试题目 几种迁移学习方式的对比 微调的注意事项 算法原理 迁移学习提出背景 几个常用概念 算法思想 什么是迁移学习 ​模型的训练与预测 为什么要迁移学习? 开发模型的方法 预训练模型方法 什么情况下可以使用迁移学习? 迁移学习的类型 应用领域 迁移学习未来的发展方向 优势和挑战 3.1 优势 3.2 挑战 应用案例 1. 项目描述 2