博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ4082][Wf2014]Surveillance[倍增]
阅读量:4493 次
发布时间:2019-06-08

本文共 1022 字,大约阅读时间需要 3 分钟。

题意

给你一个长度为 \(len\) 的环,以及 \(n\) 个区间,要你选择尽量少的区间,使得它们完全覆盖整个环。问最少要多少个区间。

\(len,n\leq 10^6\) .

分析

  • 考虑普通的区间覆盖的贪心做法,这里只需要倍增一下。

  • 如果区间 \(r< l\)\(r\) 设置成 \(r+len\)

  • 每个解都一定存在一个区间满足其标号最小,且可以通过后面的区间跳回自己的右边,只需要以这类区间开头即可。

  • 总时间复杂度为 \(O(nlogn)\) .

处理区间覆盖的技巧:记录后缀最小值 \(mn\),如果\(mn\leq l+1\) 就让指针++.这样就可以找到最靠后的满足要求的位置。

倍增的时候注意:如果不存在这么长的转移是不能够转移的,否则可能答案(步数)会算大。

代码

#include
using namespace std;#define go(u) for(int i=head[u],v=e[i].to;i;i=e[i].last,v=e[i].to)#define rep(i,a,b) for(int i=a;i<=b;++i)#define pb push_backtypedef long long LL;inline int gi(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();} return x*f;}template
inline bool Max(T &a,T b){return a
inline bool Min(T &a,T b){return b
=len) Min(ans,s); } if(ans==inf) puts("impossible"); else printf("%d\n",ans); return 0;}

转载于:https://www.cnblogs.com/yqgAKIOI/p/9850100.html

你可能感兴趣的文章
【转载】如何查看本机电脑的公网IP
查看>>
【转载】C#的ArrayList使用IndexOf方法查找第一个符合条件的元素位置
查看>>
【转载】C#中ArrayList使用RemoveRange移除一整段数据
查看>>
【转载】C#使用typeof运算符获取对象变量的具体类型Type
查看>>
【转载】c# datatable 判断值是否存在
查看>>
【转载】C#中Datatable修改列名
查看>>
【转载】通过百度站长平台查看网站搜索流量及关键字
查看>>
【转载】如何查看自己网站的搜索引擎收录量和索引量
查看>>
【转载】通过搜狗站长平台查看网站的搜狗流量及搜索关键字
查看>>
【转载】Visual Studio2017如何打包发布Winform窗体程序
查看>>
【转载】Visual Studio中WinForm窗体程序如何切换.NET Framework版本
查看>>
【转载】Visual Studio2017如何设置打包发布的WinForm应用程序的版本号
查看>>
【转载】通过搜狗站长平台手动向搜狗搜索提交死链
查看>>
【转载】通过搜狗站长平台手动向搜狗搜索提交文章加快收录
查看>>
【转载】通过百度站长平台提交网站死链
查看>>
【转载】通过搜狗站长平台提交网站域名变更后的文章地址
查看>>
【转载】Visual Studio2017中如何设置解决方案中的某个项目为启动项目
查看>>
Axios跨域实例
查看>>
ubuntu下安装pyaudio
查看>>
单片机 电子电路 嵌入式 毕设 课设 私活 代做
查看>>