题面在这里

description

在一个圆环上给出\(n\)条端点在圆环上的绳子,

每次在圆环上切割的轨迹是一条直线,可以将可以将所有与这条直线相交的绳子切断。

求切割次数的最小值。

data range

\[n\le 2\times 10^5
\]

solution

洛谷月赛题目真的棒

某题弱化版

我们记一个圆环的点割

将每条直线相对应的两个端点染上同种颜色,之后在圆环上选\(2k\)个切割点,使得每两个相邻的切割点之间没有同色点的方案

例如一个\(n=3\)的圆环:

我们能够找到一个对应\(k=2\)的点割的方案为:

那么我们知道:每个点割都对应着题目中满足要求的一个方案

考虑构造方案,只要将每两个切割点之间的点隔开即可

于是我们每隔\(k\)个点连一条边,就构造出了一个可行的方案:

这样我们把题目转化为求一个圆环的最小点割

考虑枚举第一个点的位置,断环为链:



于是我们只要向后贪心,找到其能延伸最远的位置即可:



在找到一个最小点割的同时,我们也找到了一个对应的方案;

如果我们现在直接枚举第一个点的位置,复杂度应该是\(O(n^2)\)的

我们考虑距离最短的一组点对,这组点对之间必然有一个切割点,因此我们只要在这组点对之间枚举切割点即可,假设这组点对的最短距离为\(d\),那么我们每一轮贪心地跳是\(O(n/d)\)的(只要你预处理每个点最远能够延伸的点,每一次跳的长度必然\(\ge d\)),故时间复杂度为\(O(n)\)。

code

#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<iomanip>
#include<cstring>
#include<complex>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<ctime>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define FILE "a"
#define mp make_pair
#define pb push_back
#define RG register
#define il inline
using namespace std;
typedef unsigned long long ull;
typedef vector<int>VI;
typedef long long ll;
typedef double dd;
const dd eps=1e-10;
const int mod=1e9+7;
const int N=200010;
const int inf=2147483647;
const dd pi=acos(-1);
il ll read(){
RG ll data=0,w=1;RG char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch<='9'&&ch>='0')data=data*10+ch-48,ch=getchar();
return data*w;
} il void file(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
} int n,s,c[N<<1],p[N][7],ans=inf;
int nxt[N<<1];
il int dist(int i,int j){return (i<j)?(j-i):(j-i+n);} il int go(int s){
RG int cnt=0;
for(RG int i=s,b=0;!b||i<s;i=nxt[i]){
cnt++;if(nxt[i]<i)b=1;
}
return (cnt+1)/2;
} int main()
{
n=read();n<<=1;
for(RG int i=1,x,y;i<=n/2;i++){
x=read();y=read();c[x]=c[y]=i;
if(dist(y,x)<dist(x,y))swap(x,y);p[i][0]=x;p[i][8]=y;
if(!s||dist(p[s][0],p[s][9])>dist(p[i][0],p[i][10]))s=i;
}
nxt[p[s][0]]=p[s][11];
for(RG int i=(p[s][0]-2+n)%n+1;i!=p[s][0];i=(i-2+n)%n+1){
nxt[i]=nxt[i%n+1];
if(i==p[c[i]][0]&&dist(i,nxt[i])>dist(i,p[c[i]][12]))
nxt[i]=p[c[i]][13];
if(i==p[c[i]][14]&&dist(i,nxt[i])>dist(i,p[c[i]][0]))
nxt[i]=p[c[i]][0];
}
for(RG int i=p[s][0]%n+1;i!=p[s][15]%n+1;i=i%n+1)ans=min(ans,go(i));
printf("%d\n",ans);
return 0;
}

[luoguT30208]太极剑的更多相关文章

  1. LuoguP4704 太极剑

    题面 测试要求 Bob 尽可能快地切断 n 根绳子. 所有绳子的端点两两不同,所以共有 2n 个端点.这些端点被捆在一个圆上,等距离分布.我们把这些端点按顺时针方向编号为 1 到 2n. Bob 每次 ...

  2. 洛谷P4704 太极剑(乱搞)

    题意 题目链接 Sol 不会正解 写了发暴力过了,貌似跑的还挺快?.. // luogu-judger-enable-o2 // luogu-judger-enable-o2 #include< ...

  3. 洛谷 P4704 太极剑【贪心】

    首先考虑分割线能分割一条线当且仅当分割线一个端点在这条线的ab中间,另一端点在外面,也就是分割线对应的一条弧不能同时有这条线的两个端点 每条线的两端点都染同色,然后分段,一段里面颜色互不相同,分割线就 ...

  4. Java 征途:行者的地图

    前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走进或正在 Java 世界跋涉的程序员们. 第一张,基础图 大约在 2003 年我开始知道 Java 的(当时还在用 Delph ...

  5. 记一次.NET代码重构

    好久没写代码了,终于好不容易接到了开发任务,一看时间还挺充足的,我就慢慢整吧,若是遇上赶进度,基本上直接是功能优先,完全不考虑设计.你可以认为我完全没有追求,当身后有鞭子使劲赶的时候,神马设计都是浮云 ...

  6. 【道德经】漫谈实体、对象、DTO及AutoMapper的使用

    写在前面 实体和值对象 实体和对象 故常无欲以观其妙,常有欲以观其徼 初始实体和演化实体 代码中的DTO AutoMapper实体转换 后记 实体(Entity).对象(Object).DTO(Dat ...

  7. NET代码重构

    记一次.NET代码重构   好久没写代码了,终于好不容易接到了开发任务,一看时间还挺充足的,我就慢慢整吧,若是遇上赶进度,基本上直接是功能优先,完全不考虑设计.你可以认为我完全没有追求,当身后有鞭子使 ...

  8. [转]Java 征途:行者的地图

    前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走进或正在 Java 世界跋涉的程序员们. 第一张,基础图 大约在 2003 年我开始知道 Java 的(当时还在用 Delph ...

  9. Java 征途:行者的地图 (转)

    http://www.cnblogs.com/mindwind/p/5251430.html Java 征途:行者的地图   前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走 ...

随机推荐

  1. androd hook acitivity 启动流程,替换启动的activity(Android Instrumentation)

    前言:如果程序想要知道有activity启动,如果想要拦截activity,然后跳转到指定的activity怎么办? 我们看下ActivityThread 里面: private Activity p ...

  2. WEB页面常用基本控件测试用例

    一.树控件的测试外观操作 1)项目中的所有树是否风格一致 2)树结构的默认状态是怎样的.比如默认树是否是展开,是展开几级?  是否有默认的焦点? 默认值是什么?展开的节点图标和颜色? 2.执行操作 1 ...

  3. 用Python实现一个端口扫描,只需简单几步就好

    一.常见端口扫描的原理 0.秘密扫描 秘密扫描是一种不被审计工具所检测的扫描技术. 它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己. 秘密扫描能躲避IDS.防火墙.包过滤器 ...

  4. TW实习日记:第22天

    今天开发项目的还没完成的功能点,没什么难的,样式复制粘贴,JSON表单配一配,接口调一调,基本就完成了.不过中间在写后台的一些接口时,发现被自己之前写的一些方法给坑了.为什么这样说呢,因为在之前的几个 ...

  5. lintcode 二叉树前序遍历

    二叉树的前序遍历    给出一棵二叉树,返回其节点值的前序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [1,2,3]. / ...

  6. ionic 提示框

    html文件 <ion-header> <ion-navbar> <ion-title>Toast</ion-title> </ion-navba ...

  7. 【第一章】Shell 概述

    一.什么是Shell? shell是一个命令解释器,它不仅包含大量的命令以实现操作系统的对话,还可以实现定义变量.条件判断.循环控制.函数调用等功能. 作用:解释执行用户输入的命令及程序等. 从键盘输 ...

  8. 阿里校招内推C++岗位编程题第一题 空格最少的字符串

    给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成.并输出解. 如果没有解则应该输出n/a 例如: 输入: S = “ilikealibab ...

  9. Python的实现分类

    目前流行的Python实现包括CPython,Jython,IronPython,Stackless,PyPy,Cython,Shed Skin. CPython Cpython是Python的标准实 ...

  10. 关于智能指针类型shared_ptr的计数问题

    一.关键 每个shared_ptr所指向的对象都有一个引用计数,它记录了有多少个shared_ptr指向自己 shared_ptr的析构函数:递减它所指向的对象的引用计数,如果引用计数变为0,就会销毁 ...