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]递增,所以可以维护一个单调递增的j,表示[j,i-1]范围内都可以更新f[i]。

用k-d树动态维护即可,时间复杂度$O(n\sqrt{n})$。

#include<cstdio>
#include<algorithm>
const int N=250010,inf=2000000000;
int n,L,i,j,k,root,cmp_d,X,Y;
struct P{int x,y,l,f,p;}a[N];
inline void read(int&a){char c;while(!(((c=getchar())>=‘0‘)&&(c<=‘9‘)));a=c-‘0‘;while(((c=getchar())>=‘0‘)&&(c<=‘9‘))(a*=10)+=c-‘0‘;}
struct node{int d[2],l,r,Max[2],Min[2],val,sum,f;}t[N];
inline bool cmp(node a,node b){return a.d[cmp_d]<b.d[cmp_d];}
inline void umax(int&a,int b){if(a<b)a=b;}
inline void umin(int&a,int b){if(a>b)a=b;}
inline void up(int x){
  t[x].sum=t[x].val;
  if(t[x].l){
    umin(t[x].sum,t[t[x].l].sum);
    umax(t[x].Max[0],t[t[x].l].Max[0]);
    umin(t[x].Min[0],t[t[x].l].Min[0]);
    umax(t[x].Max[1],t[t[x].l].Max[1]);
    umin(t[x].Min[1],t[t[x].l].Min[1]);
  }
  if(t[x].r){
    umin(t[x].sum,t[t[x].r].sum);
    umax(t[x].Max[0],t[t[x].r].Max[0]);
    umin(t[x].Min[0],t[t[x].r].Min[0]);
    umax(t[x].Max[1],t[t[x].r].Max[1]);
    umin(t[x].Min[1],t[t[x].r].Min[1]);
  }
}
inline void up2(int x){
  t[x].sum=t[x].val;
  if(t[x].l)umin(t[x].sum,t[t[x].l].sum);
  if(t[x].r)umin(t[x].sum,t[t[x].r].sum);
}
int build(int l,int r,int D,int f){
  int mid=(l+r)>>1;
  cmp_d=D,std::nth_element(t+l+1,t+mid+1,t+r+1,cmp);
  a[t[mid].f].p=mid;
  t[mid].f=f;
  t[mid].Max[0]=t[mid].Min[0]=t[mid].d[0];
  t[mid].Max[1]=t[mid].Min[1]=t[mid].d[1];
  if(l!=mid)t[mid].l=build(l,mid-1,!D,mid);
  if(r!=mid)t[mid].r=build(mid+1,r,!D,mid);
  return up(mid),mid;
}
inline void change(int x,int p){for(t[x].val=p;x;x=t[x].f)up2(x);}
void ask(int x){
  if(t[x].Min[0]>X||t[x].Max[1]<Y||t[x].sum>=k)return;
  if(t[x].Max[0]<=X&&t[x].Min[1]>=Y){k=t[x].sum;return;}
  if(t[x].d[0]<=X&&t[x].d[1]>=Y&&t[x].val<k)k=t[x].val;
  if(t[x].l)ask(t[x].l);
  if(t[x].r)ask(t[x].r);
}
int main(){
  read(n),read(L);
  a[1].x=0,a[1].y=inf;
  for(i=2;i<=n;i++)read(a[i].x),read(a[i].y),read(a[i].l),a[i].f=inf;
  for(i=1;i<=n;i++)t[i].d[0]=a[i].x,t[i].d[1]=a[i].y,t[i].val=a[i].f,t[i].f=i;
  root=build(1,n,0,0);
  for(i=2,j=1;i<=n;i++){
    while(a[i].l-a[j].l>L)change(a[j++].p,inf);
    k=inf,X=a[i].y,Y=a[i].x,ask(root);
    if(k<inf)change(a[i].p,a[i].f=k+1);
    printf("%d\n",a[i].f<inf?a[i].f:-1);
  }
  return 0;
}

  

时间: 2024-08-10 23:29:17

BZOJ1171 : 大sz的游戏的相关文章

BZOJ1171: 大sz的游戏&amp;BZOJ2892: 强袭作战

Description 大sz最近在玩一个由星球大战改编的游戏.话说绝地武士当前共控制了N个星球.但是,西斯正在暗处悄悄地准备他们的复仇计划.绝地评议会也感觉到了这件事.于是,准备加派绝地武士到各星球防止西斯的突袭.一个星球受到攻击以后,会尽快通知到总基地.需要的时间越长的星球就需要越多绝地武士来防御.为了合理分配有限的武士,大sz需要你帮他求出每个星球各需要多少时间能够通知到总基地.由于某种原因,N个星球排成一条直线,编号1至N.其中总基地建在1号星球上.每个星球虽然都是绝地武士控制的,但是上

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

2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] Description 在一个没有冬马的世界里,经历了学园祭后的春希着急着想要见到心爱的雪菜.然而在排队想见雪菜的fans太多了,春希一时半会凑不到雪菜面前. 作为高帅富,这样的问题怎么能难倒春希?春希从武也手中拿到了取自金闪闪宝库里的多啦A梦的传话筒,并且给每一个排队的fans都发了一个传话筒. 于

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

大sz的游戏 Time Limit: 50 Sec  Memory Limit: 357 MBSubmit: 536  Solved: 143[Submit][Status][Discuss] Description 大sz最近在玩一个由星球大战改编的游戏.话说绝地武士当前共控制了N个星球.但是,西斯正在暗处悄悄地准备他们的复仇计划.绝地评议会也感觉到了这件事.于是,准备加派绝地武士到各星球防止西斯的突袭.一个星球受到攻击以后,会尽快通知到总基地.需要的时间越长的星球就需要越多绝地武士来防御.为

[BZOJ1171][BZOJ2892]大sz的游戏

试题描述 大sz最近在玩一个由星球大战改编的游戏.话说绝地武士当前共控制了N个星球.但是,西斯正在暗处悄悄地准备他们的复仇计划.绝地评议会也感觉到了这件事.于是,准备加派绝地武士到各星球防止西斯的突袭.一个星球受到攻击以后,会尽快通知到总基地.需要的时间越长的星球就需要越多绝地武士来防御.为了合理分配有限的武士,大sz需要你帮他求出每个星球各需要多少时间能够通知到总基地.由于某种原因,N个星球排成一条直线,编号1至N.其中总基地建在1号星球上.每个星球虽然都是绝地武士控制的,但是上面居住的生物不

1353 大神的游戏

1353 大神的游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 在那遥远的机房,有一片神奇的格子.为了方便起见,我们编号为1~n.传说只要放入一些卡片,就能实现愿望.卡片一共有m种颜色,但是相邻的格子间不能放入相同颜色的卡片.只要不重复的摆出所有组合,就能召唤出神汉堡 @解决掉你 大神,为你实现梦想.从古书中翻出这个记载的shc同学,便日以夜继的摆起了他的卡片.现在他想知道一共有多少种不同的组合不合法,以便算出愿望实

大嘴鱼游戏

设计小组: 066季忠祥 048李春晓 项目名称:大嘴鱼吃豆子 编程语言:Java 要求: 设计一款休闲小游戏,大嘴鱼吃豆子.要求操作简单,有简单介绍和操作方法. 游戏说明: 大嘴鱼游戏的简单使用说明:使用键盘上的上.下.左.右控制大嘴鱼的方向,每吃1条小鱼,得分加1分.每吃10条小鱼,大嘴鱼将升级:大小加1,速度加2. 二.截图 三.约定规范 代码写清注释 注意段落缩进 更改代码要做记录 四.时间记录 项目选题:2小时 设计思路:1天 明确分工:2小时 代码编写:2天 测试:3小时 上传代码:

[知了堂学习笔记]_用JS制作《飞机大作战》游戏_第1讲(素材查找和界面框架搭建)

一.查找素材: 二.分析游戏界面框架: 登录界面.游戏界面.暂停游戏界面.玩家死亡后弹出界面:并对应的界面包含什么元素: 三.分别搭建以上四个界面: 1.登录界面与游戏界面框架(隐藏游戏界面,四个界面的宽度和高度要一致): HTML代码: <!--main div是游戏界面的大DIV --> <div id="main" style="height: 643px;"> <!--玩家头像DIV--> <div id="

[知了堂学习笔记]_用JS制作《飞机大作战》游戏_第2讲(四大界面之间的跳转与玩家飞机的移动)

一.通过点击按钮事件,实现四大界面之间的跳转: (一)跳转的思路: 1.打开软件,只显示登录界面(隐藏游戏界面.暂停界面.玩家死亡界面) 2.点击微信登录(QQ登录)跳转到游戏界面,隐藏登录界面 3.点击暂停,弹出具有透明度的暂停界面 4.点击暂停界面的开始按钮,隐藏暂停界面,调用开始方法(点击登录跳转的方法): 5.点击暂停界面的退出游戏,只显示登录界面,隐藏其他界面: 6.游戏结束界面,该界面的跳转目前还不能通过游戏实现,可以先建设(根据上一讲的游戏界面图片制作). 7.点击游戏结束界面的开

刺猬大作战(游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4)

游戏特性[编辑] 游戏引擎用Free Pascal写成,GUI用C++写成,使用SDL和Qt4[2]. 0.9.12开始支持实时动态缩放游戏画面. 个性化[编辑] 刺猬大作战有着高度定制性 游戏模式:游戏方式可以发生很大变化,比如棒球模式中,所有刺猬都有保护膜无法损伤,只能击入水中退场 可以制作语音,游戏已经包括如海盗,唱诗风格等五种风格,使用开放的ogg格式 纸娃娃系统,不只可以为每个队员命名,还可以用头饰分辨每个人,已有超过90种头部装饰分辨每个刺猬 支持定制团队背景和离场的动画效果 武器[