2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)
传送门
题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4,5][1,3],[4,5]不合法[1,4],[4,5][1,4],[4,5][1,4],[4,5]合法。
思路:把坐标先离散化,然后破环为链,接着用线段树维护每个点向左走一步最多走到哪个点,然后就可以用ststst表维护每个点向左走2k2^k2k步最多走到哪个点,最后对于每条线段倍增求答案即可。
代码:
#include<bits/stdc++.h>
#define fi first
#define se second
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
static char buf[rlen],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return ans;
}
typedef pair<int,int> pii;
const int N=8e5+5;
int n,m,val[N],sig=0,st[N][20],vl[2][N],vr[2][N];
pii a[N];
namespace sgt{
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (l+r>>1)
int mx[N<<2];
inline void pushnow(int p,int v){mx[p]=max(mx[p],v);}
inline void pushdown(int p){pushnow(lc,mx[p]),pushnow(rc,mx[p]);}
inline void update(int p,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr)return pushnow(p,v);
pushdown(p);
if(qr<=mid)update(lc,l,mid,ql,qr,v);
else if(ql>mid)update(rc,mid+1,r,ql,qr,v);
else update(lc,l,mid,ql,mid,v),update(rc,mid+1,r,mid+1,r,v);
}
inline void query(int p,int l,int r){
if(l==r){st[l][0]=mx[p];return;}
pushdown(p);
query(lc,l,mid),query(rc,mid+1,r);
}
#undef lc
#undef rc
#undef mid
}
inline int find(const int&x){return lower_bound(val+1,val+sig+1,x)-val;}
inline int query(int s,int t){
int ret=0;
for(ri i=19;~i;--i){
if(!st[s][i]||st[s][i]>=t)continue;
s=st[s][i];
ret|=1<<i;
}
return ret+1;
}
int main(){
n=read(),m=read();
val[++sig]=1,val[++sig]=m,val[++sig]=m+1,val[++sig]=m<<1;
for(ri i=1;i<=n;++i)val[++sig]=a[i].fi=read(),val[++sig]=a[i].se=read(),val[++sig]=a[i].fi+m,val[++sig]=a[i].se+m;
sort(val+1,val+sig+1),sig=unique(val+1,val+sig+1)-val-1;
for(ri i=1;i<=n;++i)vl[0][i]=find(a[i].fi),vl[1][i]=find(a[i].fi+m),vr[0][i]=find(a[i].se),vr[1][i]=find(a[i].se+m);
for(ri i=1;i<=n;++i){
if(a[i].fi<=a[i].se){
sgt::update(1,1,sig,vl[0][i],vr[0][i],vr[0][i]);
sgt::update(1,1,sig,vl[1][i],vr[1][i],vr[1][i]);
}
else{
sgt::update(1,1,sig,1,vr[0][i],vr[0][i]);
sgt::update(1,1,sig,vl[0][i],vr[1][i],vr[1][i]);
sgt::update(1,1,sig,vl[1][i],sig,sig);
}
}
sgt::query(1,1,sig);
for(ri j=1;j<20;++j)for(ri i=1;i<=sig;++i)st[i][j]=st[st[i][j-1]][j-1];
for(ri i=1;i<=n;++i)cout<<1+query(a[i].se<a[i].fi?vr[1][i]:vr[0][i],vl[1][i])<<' ';
return 0;
}
2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)的更多相关文章
- BZOJ4444 SCOI2015国旗计划(贪心+倍增)
链上问题是一个经典的贪心.于是考虑破环成链,将链倍长.求出每个线段右边能作为后继的最远线段,然后倍增即可. #include<iostream> #include<cstdio> ...
- 2019.03.26 bzoj4448: [Scoi2015]情报传递(归并排序+树链剖分)
传送门 题意简述: 给一棵nnn个点的树,树上每个点表示一个情报员,一共有mmm天,每天会派发以下两种任务中的一个任务: 1.搜集情报:指派T号情报员搜集情报 2.传递情报:将一条情报从X号情报员传递 ...
- 2019.03.26 bzoj4447: [Scoi2015]小凸解密码(线段树)
传送门 题意简述:咕咕咕 思路:考虑预处理出bbb数组,然后每次改动aaa都只会对第iii和i+1i+1i+1这两个位置产生影响,于是可以用线段树来维护bbb数组. 现在求答案的方法是断环为链,倍增整 ...
- 2019.03.09 codeforces833B. The Bakery(线段树优化dp)
传送门 线段树优化dpdpdp入门题. 要求把nnn个数分成kkk段,每段价值为里面不相同的数的个数,求所有段的价值之和最大值.n≤35000,k≤50n\le35000,k\le50n≤35000, ...
- [BZOJ4444][SCOI2015]国旗计划(倍增)
链上是经典贪心问题,将线段全按左端点排序后把点全撒在线段右端点上.这里放到环上,倍长即可. 题目保证不存在区间包含情况,于是有一种暴力做法,先将战士的管辖区间按左端点从小到大排序,对于询问x,从x战士 ...
- BZOJ4444 : [Scoi2015]国旗计划
首先将坐标离散化,因为区间互不包含,可以理解为对于每个起点输出最少需要多少个战士. 将环倍长,破环成链,设$f[i]$表示区间左端点不超过$i$时右端点的最大值,可以通过$O(n)$递推求出. 那么如 ...
- 2019.03.26 bzoj4446: [Scoi2015]小凸玩密室(树形dp)
传送门 题意简述: 给一棵完全二叉树,有点权aia_iai和边权,每个点有一盏灯,现在要按一定要求点亮: 任意时刻点亮的灯泡必须连通 点亮一个灯泡后必须先点亮其子树 费用计算如下:点第一盏灯不要花费 ...
- [BZOJ4444][SCOI2015]国旗计划-[ST表]
Description 传送门 Solution 说真的这道题在场上没做出来的我必定是脑子有洞.. 我们用st表记录以某个位置开始,派了1<<j个战士能到达的最远位置. 由于边境线是一圈, ...
- 【BZOJ4444】[Scoi2015]国旗计划 双指针+倍增
[BZOJ4444][Scoi2015]国旗计划 Description A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形 ...
随机推荐
- if、for、while的详解及实例(一)
实例一:猜字谜a = 1i = 0while a != 20: a = int (input ('请输入你猜的数字:')) i += 1 print(i) if a == 20: if i<3: ...
- mysql左连接右连接(查询两张表不同的数据)
有两张表:一张A表he一张B表 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 :right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录: ...
- jQuery之遍历索引相关方法
遍历索引相关方法: .each(),补充.children() .index() 1 .each() 2..children() .index()
- Halcon知识点随记(每日更新)
部分积累自重码网视频 1.dev_update_off.dev_update_on 一般dev_update_off放在开始,dev_update_on放在程序结束 dev_update_window ...
- shell 启动和停止脚本
启动脚本 start_kmeans_v3.sh #!/bin/bash #用于kmeans_data_v3_hadle启动 ps -ef | grep kmeans_data_v3_hadle.py ...
- Java框架spring 学习笔记(十二):aop实例操作
使用aop需要在网上下载两个jar包: aopalliance.jar aspectjweaver.jar 为idea添加jar包,快捷键ctrl+shift+alt+s,打开添加jar包的对话框,将 ...
- ucos中需要注意的全局变量
首先聊一聊全局变量: 在慕课上学习浙大老师的C语言课程的时候,翁恺老师一直在强调在程序中我们要避免使用全局变量,C语言的程序员(尤其像我这样的野生程序员)为了方便,经常会不顾这个编码规范.全局变量有一 ...
- VXLAN实验
拓扑图: SPINE配置: hostname SPINE-1vdc SPINE-1 id 1 limit-resource vlan minimum 16 maximum 4094 limit-res ...
- H-Modify Minieye杯第十五届华中科技大学程序设计邀请赛现场赛
题面见 https://ac.nowcoder.com/acm/contest/700#question 题目大意是有n个单词,有k条替换规则(单向替换),每个单词会有一个元音度(单词里元音的个数)和 ...
- [ArcGIS]ArcGIS Server环境搭建,发布服务,以及使用ArcGIS API for JavaScript
环境搭建 安装Web服务器 IIS 控制面板-程序-程序和功能-启用或关闭Windows功能,勾选以下 安装VisualStudio,选择包括ASP.NET模块 安装ArcGIS服务器 ArcGIS ...