【题目链接】

  • 点击打开链接

【思路要点】

  • 对于 M = 1 M=1 M=1 的情况,问题即为求半平面交。
  • 考虑 M M M 更大的情况,以 M = 2 M=2 M=2 为例。
  • 首先去掉排名可以为第一的人,则要想取得第二,必须在剩下的人中获得第一,对剩下的人做一次半平面交。
  • 每个排名可以为第一的人领先半平面交上的所有人的 x x x 一定是一个非空区间,可以在形成的凸包上直接二分找到这个区间 [ l i , r i ] [l_i,r_i] [li​,ri​] 。则要想取得第二,必须满足在半平面交上的横坐标区间至少存在一个整点被至多一个 [ l i , r i ] [l_i,r_i] [li​,ri​] 覆盖。
  • 对端点进行差分 + + + 排序的处理即可。
  • 时间复杂度 O ( N M L o g N ) O(NMLogN) O(NMLogN) ,代码细节较多。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
const long long INF = 1e18;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
template <typename T> void chkmax(T &x, T y) {x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {x = min(x, y); }
template <typename T> void read(T &x) {x = 0; int f = 1;char c = getchar();for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';x *= f;
}
template <typename T> void write(T x) {if (x < 0) x = -x, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {write(x);puts("");
}
struct frac {__int128 x, y; };
struct info {int k, home; ll b; };
inline ll floor(const frac &a) {return a.x / a.y; }
inline ll ceil(const frac &a) {return a.x / a.y + (a.x % a.y != 0); }
inline bool operator < (const frac &a, const ll &b) {return a.x < a.y * b; }
inline bool operator < (const frac &a, const frac &b) {return a.x * b.y < a.y * b.x; }
inline frac make(const ll &x, const ll &y) {assert(y != 0);if (y > 0) return (frac) {x, y};else return (frac) {-x, -y};
}
inline frac inter(const info &a, const info &b) {return make(b.b - a.b, a.k - b.k);
}
int n, m, top, ans[MAXN];
info a[MAXN], s[MAXN];
bool cmp(info a, info b) {if (a.k == b.k) return a.b > b.b;else return a.k < b.k;
}
void halfplane() {top = 0;for (int i = 1; i <= n; i++) {if (ans[a[i].home] != -1) continue;while (top >= 2 && inter(a[i], s[top - 1]) < inter(s[top], s[top - 1])) top--;if (top == 1 && a[i].b > s[top].b) top--;if (top == 0 || a[i].k != s[top].k) s[++top] = a[i];}
}
int main() {read(n), read(m);for (int i = 1; i <= n; i++) {int x; ll y; read(x), read(y);a[i] = (info) {x, i, y};ans[i] = -1;}sort(a + 1, a + n + 1, cmp);for (int t = 1; t <= m; t++) {halfplane();if (top == 0) break;s[0] = s[1], s[0].k = 0;vector <pair <ll, int>> events; int now = 0;for (int i = 1; i <= n; i++)if (ans[a[i].home] != -1) {int l = 0, r = top;while (l < r) {int mid = (l + r + 1) / 2;if (a[i].k <= s[mid].k || inter(a[i], s[mid - 1]) < inter(s[mid], s[mid - 1])) r = mid - 1;else l = mid;}if (l == 0) now++;else events.emplace_back(floor(inter(a[i], s[l])) + 1, 1);if (a[i].k < s[top].k) {l = 1, r = top + 1;while (l < r) {int mid = (l + r) / 2;if (a[i].k >= s[mid].k || (mid != top && inter(s[mid], s[mid + 1]) < inter(a[i], s[mid + 1]))) l = mid + 1;else r = mid;}events.emplace_back(ceil(inter(a[i], s[l])), -1);}}sort(events.begin(), events.end());unsigned pos = 0;for (int i = 1; i <= top; i++) {ll l = ceil(inter(s[i], s[i - 1])),r = i == top ? INF : floor(inter(s[i], s[i + 1]));if (l > r) continue;int Min = now;if (pos < events.size() && events[pos].first == l) Min = t;while (pos < events.size() && events[pos].first <= r) {ll val = events[pos].first;while (pos < events.size() && events[pos].first == val) now += events[pos++].second;chkmin(Min, now);}if (Min == t - 1) ans[s[i].home] = t;}}for (int i = 1; i <= n; i++)printf("%d ", ans[i]);return 0;
}

【LOJ3047】「ZJOI2019」浙江省选相关推荐

  1. Ps 初学者教程「51」如何在产品照片中改变对象颜色?

    欢迎观看 Photoshop 教程,小编带大家了解如何改变对象颜色,在产品照片上应用各种颜色. 在本教程中你将学习如何在 Photoshop 中为各种对象匹配颜色,我们要处理的文件包含两个图层:一个房 ...

  2. 对话雪球创始人方三文:「打工人」如何选行业、找工作、挑老板?|创新大会 2021...

    面对内心要悲观和保守,面对外界要乐观和进取. 如何赚钱永远是多数人关心的头等大事. 但多数年轻人积累财富的起点,基本是作为「打工人」赚取的工资.这时候,除了入对行业,选对公司和老板也极其关键. 在中国 ...

  3. 车企「激进」定义智能化,硬件标配/选装背后的市场逻辑

    客观来说,今年亮相,主打智能化标签的新能源车型都具备了与燃油车展开对抗战的能力.至少,到目前为止,从整车设计尤其是智能化配置上,各家车企都是狠下功夫. 昨晚,上汽旗下飞凡品牌首款车型R7正式亮相,共计 ...

  4. 86岁还在录网课:MIT教授Gilbert Strang最新「线性代数」课程上线,被清华选作教材...

    转自:机器之心 参与:张倩.Jamin.Raccon X 讲 MIT 线性代数经典课程的 Gilbert Strang 教授已经 86 岁高龄了.他的书被清华选作教材,课程吸引了国内外大批学子.如今疫 ...

  5. 剑网3分服务器还是微信,「剑网3是选月卡区好还是点卡区好」百家号

    「剑网3是选月卡区好还是点卡区好」百家号_作者自评: 如何看待百家号Lite小程序热议话题「剑网3是选月卡区好还是点卡区好」 这里是专注于有为青年游戏体验的敢为青年游场,我是敢哥!这个我觉得其实还是因 ...

  6. 选股前,先选「派别」

    读过武侠小说的朋友都知道江湖上有"派别"之说,在股票投资圈子里,仍然有"派别"一词,为什么要强调「选股前,先选派别」? 打开任意一个股票交易软件,首先看到的是一 ...

  7. 五芳斋:「老」字号需要「新」故事

    [潮汐商业评论/原创] 导语: 本文是潮汐商业评论关于「老字号故事」的第一篇,我们希望通过一个个「老」字号的「新」故事,从不同视角,为读者展示一个更加有趣且多元的商业世界. 刚刚过去的中秋节,Dawn ...

  8. 消除左递归实验代码_「leetcode」108. 构造二叉搜索树【递归】【迭代】详解!

    构造二叉搜索树,一不小心就平衡了 ❞ 108.将有序数组转换为二叉搜索树 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树 ...

  9. R和Python谁更好?这次让你「鱼与熊掌」兼得

    作者 | Parul Pandey 译者 | 大鱼 责编 | Jane 出品 | Python大本营(公众号id:pythonnews) 如果你从事在数据科学领域,提到编程语言,一定能马上想到 R 语 ...

最新文章

  1. 几个判断时不变系统的精彩例子
  2. ASP.NET-------字符串和字节数组转换
  3. 考前自学系列·计算机组成原理·微程序微指令微命令微操作
  4. mysql now str,数据库学习之MySQL (十)—— 日期和时间函数 NOW STR_TO_DATE DATE_FORMAT 流程控制函数 IF IFNULL CASE...
  5. 解读阿里官方代码规范
  6. vue window.location.href 返回页面不刷新_前端框架vue中的keep-alive总结实践
  7. python canvas画弧度_超清字符画——Python代码
  8. 布局优化之ViewStub、Include、merge使用分析
  9. 图解 head first 设计模式
  10. 新安装的VS2019+opencv4.20如何删除旧的opencv配置
  11. 如何弄ad装配图_AD打印装配图的细节
  12. 如何将wireshark抓包的中文恢复
  13. Padded优化LinkedTransferQue并发性能是错误方向
  14. iOS 打开AppStore指定app下载页
  15. 计算机毕业设计基于asp.net的旅游网站
  16. 汉诺塔(C语言实现)
  17. 类脑智能:人造超级大脑
  18. 那些优秀的软件架构图,都是怎么画的?
  19. 围棋口诀两百句(转)
  20. 形容计算机科学与技术的句子,描写科学的句子精选40句

热门文章

  1. 爬取斗鱼LOL主播人气数据,并显示排行榜 [网络爬虫] [应用案例][请求头][模块]
  2. c语言gets,getc,C++_C语言的getc()函数和gets()函数的使用对比,C语言getc()函数:从流中读取字 - phpStudy...
  3. jhipster 工具之 JDL
  4. 不登录QQ,恢复QQ聊天中的语音到电脑上,并导出为MP3
  5. 智慧法院智慧诉讼服务中心具体具备哪些功能?
  6. 造车,家电巨头的新战场
  7. 图像处理:TDLMS算法原理介绍及MATLAB实现
  8. Mips架构32位CPU实现(31条指令)Verilog
  9. python语言概述_(一)Python从入门到精通之语言简介
  10. Opencv-Python处理车道线检测