Description

大sz最近在玩一个由星球大战改编的游戏。话说绝地武士当前共控制了N个星球。但是,西斯正在暗处悄悄地准备他们的复仇计划。绝地评议会也感觉到了这件事。于是,准备加派绝地武士到各星球防止西斯的突袭。一个星球受到攻击以后,会尽快通知到总基地。需要的时间越长的星球就需要越多绝地武士来防御。为了合理分配有限的武士,大sz需要你帮他求出每个星球各需要多少时间能够通知到总基地。由于某种原因,N个星球排成一条直线,编号1至N。其中总基地建在1号星球上。每个星球虽然都是绝地武士控制的,但是上面居住的生物不一定相同,并且科技水平也不一样。第i个星球能收到并分析波长在[xi, yi]之间的信号,并且也能够发出在这个区间的信号,但是不能发出其他任何波长的信号。由于技术原因,每个星球只能发信号到比自己编号小的距离不超过L的星球。特别地,强大的总基地可以接收任何波长的信号。每个星球处理接收到的数据需要1个单位时间,传输时间可以忽略不计。

Input

第一行两个正整数N、L。接下来N-1行,总共第i行包含了三个正整数xi、yi、li,其中li表示第i个星球距离1号星球li,满足li严格递增。

Output

总共N-1行,每行一个数分别表示2到N号星球至少需要多少单位时间,总基地能够处理好数据,如果无法传到总基地则输出-1。

Sample Input

input1
3 1
1 2 1
2 3 2
input 2
3 3
1 2 1
2 3 2

Sample Output

output1
1
2
output2
1
1
30%的数据满足N <=20000;
100%的数据满足2 <=N<= 2.5*10^5、0<=xi,yi,li<=2*10^9,1<=L<=2*10^9,xi<=yi.
 
就这么出双倍经验题好么?
考虑DP,设f[i]表示从1到i号星球最少步数,则f[i]=min(f[j]+1|[xj,yj]∩[xi,yi]!=Φ)。
变形一下,f[i]=min(f[j]+1|xj<=yi&&yj>=xi),这样就变成一个简单的二维偏序结构了,找一个支持在平面直角坐标系上增加删除点,询问区域最小值的数据结构就行了。
使用树套树或kd树或线段树分治+扫描线都可以,我使用了一棵kd树,不知道为什么跑得很慢,加上定期重构才通过。
#include<cstdio>
#include<cctype>
#include<queue>
#include<cstring>
#include<algorithm>
#define L T[o].lc
#define R T[o].rc
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i;i=next[i])
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char Getchar() {
if(head==tail) {
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
}
return *head++;
}
inline int read() {
int x=0,f=1;char c=Getchar();
for(;!isdigit(c);c=Getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=Getchar()) x=x*10+c-'0';
return x*f;
}
const int maxn=250010;
const int inf=2e9;
int n,len,D,rt,ToT;
int x[maxn],y[maxn],p[maxn];
struct Node {
int x[2],mx[2],mn[2],minv,del;
int lc,rc,val;
bool operator < (const Node& ths) const {
if(ths.x[D]!=x[D]) return x[D]<ths.x[D];
if(ths.x[D^1]!=x[D^1]) return x[D^1]<ths.x[D^1];
return val<ths.val;
}
bool operator == (const Node& ths) const {
return x[0]==ths.x[0]&&x[1]==ths.x[1]&&val==ths.val;
}
}T[maxn],A;
void maintain(int o) {
T[o].minv=min(T[L].minv,T[R].minv);
if(!T[o].del) {
T[o].minv=min(T[o].minv,T[o].val);
T[o].mx[0]=T[o].mn[0]=T[o].x[0];
T[o].mx[1]=T[o].mn[1]=T[o].x[1];
}
rep(c,0,1) {
T[o].mx[c]=max(T[o].mx[c],max(T[L].mx[c],T[R].mx[c]));
T[o].mn[c]=min(T[o].mn[c],min(T[L].mn[c],T[R].mn[c]));
}
}
void insert(int& o,int cur) {
if(!o) T[o=++ToT]=A;
else D=cur,insert(A<T[o]?L:R,cur^1);
maintain(o);
}
void remove(int& o,int cur) {
if(!o) {puts("2333");return;}
if(!T[o].del&&T[o]==A) T[o].del=1;
else D=cur,remove(A<T[o]?L:R,cur^1);
maintain(o);
}
int query(int& o,int a,int b) {
if(!o) return inf;
int res=inf;
if(T[o].mn[0]>b||T[o].mn[1]>a) return inf;
if(T[o].mx[0]<=b&&T[o].mx[1]<=a) return T[o].minv;
if(!T[o].del&&T[o].x[0]<=b&&T[o].x[1]<=a) res=min(res,T[o].val);
if(T[L].mn[0]<=b&&T[L].mn[1]<=a) res=min(res,query(L,a,b));
if(T[R].mn[0]<=b&&T[R].mn[1]<=a) res=min(res,query(R,a,b));
return res;
}
void build(int& o,int l,int r,int cur) {
o=0;if(l>r) return;
int mid=l+r>>1;o=mid;D=cur;
nth_element(T+l,T+mid,T+r+1);
build(L,l,mid-1,cur^1);
build(R,mid+1,r,cur^1);
maintain(o);
}
void rebuild() {
int m=0;
rep(i,1,ToT) if(!T[i].del) T[++m]=T[i];
build(rt,1,ToT=m,0);
}
int f[maxn];
int main() {
T[0].mx[0]=T[0].mx[1]=-inf;
T[0].mn[0]=T[0].mn[1]=T[0].minv=inf;
n=read();len=read();x[1]=0;y[1]=inf;
rep(i,2,n) x[i]=read(),y[i]=read(),p[i]=read();
int cur=1;A.x[0]=0;A.x[1]=-inf;A.val=0;
insert(rt,0);
rep(i,2,n) {
f[i]=inf;
while(p[i]-p[cur]>len) {
A.x[0]=x[cur];A.x[1]=-y[cur];A.val=f[cur];
remove(rt,0);cur++;
}
f[i]=min(f[i],query(rt,-x[i],y[i])+1);
A.x[0]=x[i];A.x[1]=-y[i];A.val=f[i];insert(rt,0);
if(i%800==0) rebuild();
}
rep(i,2,n) printf("%d\n",f[i]==inf?-1:f[i]);
return 0;
}

  

BZOJ1171: 大sz的游戏&BZOJ2892: 强袭作战的更多相关文章

  1. bzoj 1171 大sz的游戏& 2892 强袭作战 (线段树+单调队列+永久性flag)

    大sz的游戏 Time Limit: 50 Sec  Memory Limit: 357 MBSubmit: 536  Solved: 143[Submit][Status][Discuss] Des ...

  2. BZOJ1171 : 大sz的游戏

    f[i]=min(f[j])+1,线段j与线段i有交,且l[i]-l[j]<=L. 线段j与线段i有交等价于y[j]>=x[i],x[j]<=y[i]. 因为l[i]递增,所以可以维 ...

  3. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

  4. [BZOJ1171][BZOJ2892]大sz的游戏

    [BZOJ1171][BZOJ2892]大sz的游戏 试题描述 大sz最近在玩一个由星球大战改编的游戏.话说绝地武士当前共控制了N个星球.但是,西斯正在暗处悄悄地准备他们的复仇计划.绝地评议会也感觉到 ...

  5. 【BZOJ1171】大sz的游戏(线段树+单调队列)

    点此看题面 大致题意: 有\(n\)个点,两点间最大通讯距离为\(L\).已知除\(1\)号点外第\(i\)个点能够发出和接收的信号区间\([l_i,r_i]\)以及到\(1\)号点的距离\(dis_ ...

  6. BZOJ 1171: 大sz的游戏

    ZJOI讲课的题目,数据结构什么的还是很友好的说 首先我们发现题目中提到的距离\(\le L\)的东西显然可以用单调队列维护 但是暴力搞去不掉区间并的限制,那么我们考虑从区间并入手 对于这种问题的套路 ...

  7. 大神的游戏(codevs 1353)

    题目描述 Description 在那遥远的机房,有一片神奇的格子.为了方便起见,我们编号为1~n.传说只要放入一些卡片,就能实现愿望.卡片一共有m种颜色,但是相邻的格子间不能放入相同颜色的卡片.只要 ...

  8. ID@Xbox计划宣传片 XboxOne喜迎大波小游戏(转)

    微软Xbox One游戏不够多?别担心,微软的ID@Xbox计划将带来一大波独立游戏!微软在今天正式公布了即将登陆旗下的Xbox One主机平台的独立游戏阵容,数量多达32款,官方的宣传片也已放出,感 ...

  9. 开源玩家福利:十大Linux免费游戏

    假如当你考虑从Windows平台迁移至Linux平台时,“我能在Linux平台上游戏吗?”这类疑问正困扰着你,那么对此这有一个答案就是“快去Linux平台吧!”.感谢开源组织一直以来坚持不懈为Linu ...

随机推荐

  1. 【131031】struts 1 中 <html:form>

    <DIV>来看看 使用 ActionForm 这个主题,当时使用了一个静态表单网页:<BR>* form.htm<BR><BR><BR>&l ...

  2. Oracle锁定和解锁用户的命令

    转:http://database.51cto.com/art/200910/158576.htm 在DBA的日常工作中,经常遇到为Oracle用户解锁的操作:这篇文章给出在命令行下进行Oracle用 ...

  3. HDU4495 Rectangle

    求组成的等腰三角形面积最大值. 对此题的总结:暴力出奇迹 组成的三角形放置方式一共只有4种,用ans表示目前已知的最长三角形的边长,从上到下,从左到右枚举顶点,再枚举边长,一个重要剪枝是枚举边长l时先 ...

  4. MS SQL 合并结果集并求和 分类: SQL Server 数据库 2015-02-13 10:59 92人阅读 评论(0) 收藏

    业务情景:有这样一张表:其中Id列为表主键,Name为用户名,State为记录的状态值,Note为状态的说明,方便阅读. 需求描述:需要查询出这样的结果:某个人某种状态的记录数,如:张三,待审核记录数 ...

  5. 不定义JQuery插件,不要说会JQuery 分类: JavaScript 2014-11-24 14:18 155人阅读 评论(0) 收藏

    一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人 ...

  6. angular入门

    angular入门 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  7. js判断手机端Android手机还是iPhone手机

    /*判断当前设备是平板.安卓.苹果设备*/ <script type="text/javascript"> function fBrowserRedirect(){ v ...

  8. java 存储对象

    一.存储区域: 1)寄存器.这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器根据需求进行分配.你不能直接控制,也不能在程序中感觉到寄存器存在的任何 ...

  9. java大数取模

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1214 用java写大数果然是方便多了! import java.math.BigInt ...

  10. pythonchallenge之C++学习篇-00

    前言 最近学习下C++,之前是python的用户,python解释器有诸多实现,其中最出名的要数C实现了,而且很多python的扩展模块可能要用C或者C++来写的,所以很有必要学习下C++了 为了避免 ...