[luoguT30208]太极剑

试题描述

在学习太极之后,Bob 要求 Alice 教他太极剑。Alice 告诉他首先需要通过一项基本剑术测试。测试要求 Bob 尽可能快地切断 \(n\) 根绳子。

所有绳子的端点两两不同,所以共有 \(2n\) 个端点。这些端点被捆在一个圆上,等距离分布。我们把这些端点按顺时针方向编号为 \(1\) 到 \(2n\) 。

Bob 每次切割的轨迹是一条直线,可以将所有与这条直线相交的绳子切断,他想知道至少多少次可以切断所有的绳子。

输入

第一行一个整数 \(n(1 \leq n \leq 2 \times 10^5)\),表示绳子的个数。

接下来 \(n\) 行,每行两个整数 \(a_i, b_i(1 \leq a_i, b_i \leq 2n, a_i \not= b_i)\),表示第 \(i\) 根绳子的两个端点的编号。

输出

一行一个整数,表示答案。

输入示例1

2
1 2
3 4

输出示例1

1

输入示例2

3
1 2
3 4
5 6

输出示例2

2

输入示例3

3
1 3
2 4
5 6

输出示例3

1

数据规模及约定

见“输入

题解

首先这个问题等价于“在圆周上选择尽量少的偶数个点,使得相邻两个点之间没有同色的端点,定义第 \(i\) 条线段的两个端点 \(a_i\) 和 \(b_i\) 的颜色为 \(i\)”。

首先证明“若存在 \(k\) 条直线的划分方案,则存在 \(2k\) 个点的划分方案”。这 \(k\) 条直线与圆的交点就是一个划分方案,假设相邻两个点之间有同色点,则证明某条线段没有被直线劈开。

然后证明“若存在 \(2k\) 个点的划分方案,则存在 \(k\) 调直线的划分方案”。构造方法就是每个点朝往后数 \(k\) 个点的那个点连一条直线,这样保证每一段弧都“封闭”在直线围成的一个平面区域内。

于是这两个问题就等价了。

后者显然会非常好做。考虑暴力枚举第一个划分点,那么这个圆就展开成了一条链,那么我们的目标就是用尽量少的首尾相接的区间覆盖整个链,使得每个区间内没有同色点对。显然只能贪心跳。

现在我们可以不用枚举所有的起点,考虑圆上最短的线段一定是要被切开的,那么最短的线段所覆盖的那个较短的弧上一定有一个划分点,那么在这个弧上枚举起点即可。假定这个弧上有 \(d\) 段小弧(就是两个端点之间的弧),那么我们每跳一次,显然能够至少跳 \(d\) 步,如果跳不了则说明 \(d\) 步内有同色点,那么这对同色点对应的线段就比我们最初选的那条线段更短了,与“最短”的假设矛盾。由此证明跳至多 \(\left \lfloor \frac{n}{d} \right \rfloor\) 步即可。复杂度就是线性的了(当然你要预处理每个点能跳到哪里)。

#include <bits/stdc++.h>
using namespace std;
#define rep(i, s, t) for(int i = (s), mi = (t); i <= mi; i++)
#define dwn(i, s, t) for(int i = (s), mi = (t); i >= mi; i--)int read() {int x = 0, f = 1; char c = getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }return x * f;
}#define maxn 800010
#define oo 2147483647int n, col[maxn], nxt[maxn];
bool ncol[maxn];int cdist(int a, int b) {if(a > b) swap(a, b);return min(b - a, a - 1 + (n >> 1) - b + 1);
}int ans;
void solve(int sl, int sr) {rep(s, sl, sr) {int u = s, cnt = 0;while(u < s + (n >> 1)) cnt++, u = nxt[u];ans = min(ans, cnt + 1 >> 1);}return ;
}int main() {n = read() << 2;int bestA = -1, bestB = -1;rep(i, 1, n >> 2) {int a = read(), b = read();col[a] = col[b] = col[a+(n>>1)] = col[b+(n>>1)] = i;if(bestA < 0 || cdist(a, b) < cdist(bestA, bestB)) bestA = a, bestB = b;}int rgt = 1;rep(i, 1, n) {while(rgt <= n && !ncol[col[rgt]]) ncol[col[rgt++]] = 1;nxt[i] = rgt;ncol[col[i]] = 0;}ans = oo;if(bestA > bestB) swap(bestA, bestB);if(bestB - bestA < bestA - 1 + (n >> 1) - bestB + 1) solve(bestA + 1, bestB);else solve(1, bestA), solve(bestB + 1, n >> 1);printf("%d\n", ans);return 0;
}

转载于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/9081469.html

[luoguT30208]太极剑相关推荐

  1. java工程师面试注意事项(一套太极剑法传授给你)

    1.面试时,为什么没必要紧张? 第一.从心态上你要把这次面试看做一次练习,成败都可.毕竟,说实话,面试成功是小概率事件,按照一个人面试十家公司成功一家来看,每家成功的概率只有10%.所以,完全没有必要 ...

  2. 微软洪小文:AI将成为人类未来最好的左脑

    演讲嘉宾 | 洪小文 整理 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 导读:2019 年 6 月 14 日,由清华大学五道口金融学院.清华大学国家金融研究院.清华大学研究生会联合 ...

  3. 健身提示:跑步一周只需三次 天天跑易疲劳

    跑步是最古老的运动方式之一.在远古时代,只有跑得快.跑得久,才能获得更多的猎物,并保护自身安全.跑步属于有氧运动,能够提高心肺功能.血管机能,改善代谢,提高身体灵敏性和平衡能力,还能够调节体脂,培养坚 ...

  4. 手低眼高 初学者学习Hibernate的方法

    Hibernate入门容易,掌握精通我也不敢自夸.我第一遍看Hibernate文档的时候也觉得很吃力,但不是因为Hibernate难掌握而感到吃力,是因为Hibernate文档处处都是持久层设计的经验 ...

  5. Nature论文爆出千行Python代码Bug,或影响百篇学术论文

    你的论文借鉴了 Nature 文章的代码?对不起,论文可能要重新写了. 在 10 月 8 日发表于<ACS Publication>期刊的一篇论文中,来自夏威夷大学的 Jayanti Bh ...

  6. android phone驱动_一文带你掌握 Android 系统架构

    引言 本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制.虽然Android系统非常 ...

  7. UI 设计:如何做到理性?

    本文由作者 SnowDesign 于社区发布 UI 设计,是用理性方法,来满足需求,并带来美学享受. 本篇探讨 UI 设计如何做到理性.全文共有三部分:有哪些理性,如何做到理性,止步于理性吗. 01  ...

  8. 从变分编码、信息瓶颈到正态分布:论遗忘的重要性

    作者丨苏剑林 单位丨广州火焰信息科技有限公司 研究方向丨NLP,神经网络 个人主页丨kexue.fm 这是一篇"散文",我们来谈一下有着千丝万缕联系的三个东西:变分自编码器.信息瓶 ...

  9. 一个大神的Android成长之路

    这篇文章是我的一个朋友写的,总结了这些年的技术成长之路,我觉得对于很多技术人都有借鉴的作用,技术是相通的,不要整天想一口气吃成一个胖子,不积跬步无以至千里,既然选择了技术这条路,就不畏艰辛,苦中有甜, ...

  10. Android系统架构开篇

    Android系统庞大且错综复杂,Gityuan带领大家初探Android系统整体架构,一窥其全貌. 一.引言 本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解An ...

最新文章

  1. congratulation的用法_congratulation的用法
  2. Skin设计小组新作品发布—CornflowerBlue
  3. c 语言编译是什么意思,我有个C语言编译程序,但是不知道是什么意思,望大家解释哈,在下...
  4. 谈谈Activity如何启动的
  5. IT行业常见职位职业路线图
  6. 牛客 13822 Keep In Line(枚举与暴力、Python)
  7. python怎么安装beautifulsoup,python – 安装BeautifulSoup
  8. 【C语言】在有序数组中插入一个数,保证它依然有序
  9. Android Studio 常用快捷键 for mac
  10. P5 MySQL数据类型和类型选择
  11. MySQL UTF8与UTF8MB4
  12. 20200624每日一句
  13. 空间参考(一)---墨卡托投影、高斯-克吕格投影、UTM投影的异同
  14. R语言 openair 做后向轨迹
  15. 网课研究生学术与职业素养讲座mooc答案
  16. 几分之几在手机计算机上是哪个符号,数学各 种符号怎么表达比如根号,几分之几 – 手机爱问...
  17. 宜信微服务架构落地及其演进
  18. 我的2018:微信朋友圈的24个瞬间
  19. echart——入门demo
  20. CSU2020期中测试模拟题1 问题 B: 小帅要缴税

热门文章

  1. c# 图片裁剪并画中线
  2. html 纯白色,要一张全屏的空白的图(纯白色的)
  3. 胃不好吃什么养胃 三九胃泰提示常吃芝麻更护胃
  4. 社会调查报告包括哪几个部分?
  5. 从单一服务到多元化服务,智能机器人JIMI的架构改造及逐步开放的过程
  6. JS实现鼠标点击特效,五颜六色的小球绽放
  7. LTE: SRVCC双模单待无线语音呼叫连续性
  8. 一文读懂哈希算法SHA256
  9. 第二篇:呈现内容_第一节:Control呈现
  10. 计算机查看配置的快捷键,剪映电脑版快捷键在哪里设置? 剪映查看快捷键的技巧...