洛谷P4155 [SCOI2015]国旗计划(贪心,树形结构,基数排序)
\(O(n)\)算法来啦!
复杂度优化的思路是建立在倍增思路的基础上的,看看楼上几位巨佬的描述吧。
首先数组倍长是一样的。倍增法对于快速找到\(j\)满足\(l_j+m\le r_i\)进行了优化。然后菊开队长说可以建个树优化,可是他没讲清楚就把这个神仙东西扔给了我这个蒟蒻。。。一个晚上终于把这个模性建出来了。
在倍长的序列上,我们对于每一个\(i\)找到最小的\(j\)满足\(r_j\ge l_i\)并连一条\(i\)到\(j\)的边,于是就成了一个森林。贪心地想,我们要求的东西就变成了:对于每个点,找到与它最近的祖先\(j\)满足\(l_j+m\le r_i\),\(j\)到\(i\)间的总点数就是答案。下面称\(j\)为\(i\)的决策点。
还是要树上倍增么?不不不,我们来注意一个性质:设不强制选某个战士的最优答案是\(ans\),那么如果强制选某一个,答案要么是\(ans\)要么是\(ans+1\)。显然如果一个战士能够被一个最优方案包含的话就是\(ans\),如果不能,任选一个最优方案再选他自己就可以了。
于是,假设\(x\)的决策点为\(y\),那么\(x\)的一个儿子\(x_1\)的决策点,要么还是\(y\),要么是\(y\)往\(x\)方向上的儿子。直接从上往下dfs并维护每个点的决策点就好啦!实现中,找到“\(y\)往\(x\)方向上的儿子”可以用类似Dinic当前弧的方法维护。
时间复杂度\(O(n)\),常数较大,欢迎超越。为了理论上的严格线性,蒟蒻研究了下松爷基排,还写了个template,好不麻烦。template的食用方法可以去蒟蒻的blog上看。
注意开unsigned int,没开的话蒟蒻不知道能不能过。
#include<bits/stdc++.h>
#define UI unsigned int
#define RG register
#define R RG UI
#define G if(++ip==ie)fread(ip=buf,1,N,stdin)
using namespace std;
const UI N=4e5+9;
struct Data{UI l,r,id;}a[N],b[N];
UI m,he[N],ne[N],at[N],d[N];
char buf[N],*ie=buf+N,*ip=ie-1;
inline UI in(){
G;while(*ip<'-')G;
R x=*ip&15;G;
while(*ip>'-'){x*=10;x+=*ip&15;G;}
return x;
}
template<typename T>//基数排序
inline void Radixsort(RG T*fst,RG T*lst,RG T*buf,RG int*op){
static int b[0x100];
RG UI Len=lst-fst,Sz=sizeof(T),i,j;
RG unsigned char*bgn,*end,*it;
for(i=0;i<Sz;++i){
if(op[i]==-1)continue;
bgn=(unsigned char*)fst+i;end=(unsigned char*)lst+i;
memset(b,0,sizeof(b));
for(it=bgn;it!=end;it+=Sz)++b[*it];
for(j=1;j<=0xff;++j)b[j]+=b[j-1];
for(it=end;it!=bgn;)buf[--b[*(it-=Sz)]]=*--lst;
lst=buf+Len;swap(fst,buf);
}
}
void dfs(R x,R y){
if(a[he[y]].l+m<=a[x].r)
y=he[y],--d[x];//决策点偏移
for(R&i=he[x];i;i=ne[i])
d[i]=d[x]+1,dfs(i,y);
}
int main(){
R n=in(),i,p;m=in();
for(i=1;i<=n;++i){
a[i].l=in();a[i].r=in();a[i].id=i;
if(a[i].l>a[i].r)a[i].r+=m;//环状数据处理成链意义下的
}
Radixsort(a+1,a+n+1,b+1,new int[12]{0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1});
memcpy(a+n+1,a+1,12*n);
for(i=n+1;i<=2*n;++i)//倍长处理
at[a[i-n].id]=i,a[i].l+=m,a[i].r+=m;
for(p=1,i=2;i<=2*n;++i){//建树,贪心思想
while(a[p].r<a[i].l)++p;
ne[i]=he[p];he[p]=i;
}
for(i=1;i<=n;++i)
if(!d[i])d[i]=1,dfs(i,i);
for(i=1;i<=n;++i)
printf("%d ",d[at[i]]);
puts("");
return 0;
}
洛谷P4155 [SCOI2015]国旗计划(贪心,树形结构,基数排序)的更多相关文章
- [bzoj4444] [loj#2007] [洛谷P4155] [Scoi2015] 国旗计划
Description \(A\) 国正在开展一项伟大的计划--国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了 ...
- [luogu] P4155 [SCOI2015]国旗计划(贪心)
P4155 [SCOI2015]国旗计划 题目描述 A 国正在开展一项伟大的计划 -- 国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此 ...
- [倍增]luogu P4155 [SCOI2015]国旗计划
题面 https://www.luogu.com.cn/problem/P4155 问在环上最少取多少个区间能完全覆盖环 分析 首先发现是环,先把端点变为2n方便处理,注意离散化 其次要删去贡献不如其 ...
- 4444: [Scoi2015]国旗计划|贪心|倍增
由于没有区间被其它区间包括这个条件,也就是假设li<lj那么一定满足ri<rj,就能够贪心搞一搞了. 假如区间[l,r]都已经被覆盖,那么能够继续找一个li在[l,r]范围内的最大的一个, ...
- [SCOI2015]国旗计划[Wf2014]Surveillance
[SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...
- 4444: [Scoi2015]国旗计划
4444: [Scoi2015]国旗计划 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 485 Solved: 232 Description A国 ...
- 洛谷 P2762 太空飞行计划问题 P3410 拍照【最大权闭合子图】题解+代码
洛谷 P2762 太空飞行计划问题 P3410 拍照[最大权闭合子图]题解+代码 最大权闭合子图 定义: 如果对于一个点集合,其中任何一个点都不能到达此集合以外的点,这就叫做闭合子图.每个点都有一个权 ...
- 洛谷 P1114 “非常男女”计划
To 洛谷.1114 “非常男女”计划 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验.例如,据他观察,身高相近的人 ...
- 【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增
[BZOJ4444][Scoi2015]国旗计划 Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形 ...
随机推荐
- python知识点及面试面试大集合
题目来源:武sir--一个很有意思的人,点击这儿跳转 一.基础篇 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C#.C++等其他语言的对比? 简述解 ...
- 记第一次多用户在Git提交代码
今天第一次进行了多用户(其实就两人)在自建Git服务器提交代码. 先记录碰到的问题:首先是本地提交代码时,进行了add,commit后,在push时碰到服务器故障,待设置好服务器后,再push时,却p ...
- 【学习总结】win7下安装Ubuntu双系统的日常
参考文献 1 - [双系统中删除linux(win7适用) ] 2 - [win7(32位)U盘安装.卸载ubuntu(64位)双系统] 3 - [Windows下安装Ubuntu 16.04双系统] ...
- Squid配置之使用帐号密码验证
转自: https://blog.csdn.net/atco/article/details/43448885 1.安装squid使用root用户进行操作.先使用rpm检测是否已经安装了sql ...
- MySQL根据某个字段查询重复的数据
select count(*) '个数',mobile '手机号',`name` '用户名' from users group by mobile having(count(*) > 1); = ...
- macbookpro 以及 surface 的技术规格
macbookpro 13.3 英寸 (对角线) LED 背光显示屏 (采用 IPS 技术):初始分辨率 x ( ppi),支持数百万色彩 15.4 英寸 (对角线) LED 背光显示屏 (采用 IP ...
- day 7 -1 进程理论知识
一.进程的定义 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实 ...
- Junit概述
Junit -> java unit.也就是说Junit是xunit家族中的一员. unit <- unit test case,即单元测试用例. Junit = java uni ...
- 前端开发之css
<!--页面中的组成部分通常随便打开一个网页,有文字,图片,视频,表格,音频,表单(注册信息) css 属性/尺寸/边框/背景 1.css的尺寸属性,就是大小width max-width mi ...
- python爬虫scrapy之如何同时执行多个scrapy爬行任务
背景: 刚开始学习scrapy爬虫框架的时候,就在想如果我在服务器上执行一个爬虫任务的话,还说的过去.但是我不能每个爬虫任务就新建一个项目吧.例如我建立了一个知乎的爬行任务,但是我在这个爬行任务中,写 ...