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;
}

  

转载于:https://www.cnblogs.com/wzj-is-a-juruo/p/5479035.html

BZOJ1171: 大sz的游戏BZOJ2892: 强袭作战相关推荐

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

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

  2. bzoj 1171: 大sz的游戏, bzoj 2892: 强袭作战

    标记永久化,线段树套单调队列. 标记永久化的好处在于可以减少下传标记的时间. 如果有些标记很难下传,但是打标记的顺序对结果没有影响,就可以用标记永久化 比如说 支持矩阵加.矩阵求和就可以用带标记永久化 ...

  3. [线段树 标记永久化 单调队列] BZOJ 1171 大sz的游戏 BZOJ 2892 强袭作战

    很好的题解:http://blog.sina.com.cn/s/blog_76f6777d0101dizp.html "考虑裸的n^2暴力dp. dp[i]=min(dp[j])+1 ( d ...

  4. HTML5期末大作业:游戏网页网站设计——卡通的萌王游戏网页(13页) HTML+CSS+JavaScript

    HTML5期末大作业:游戏网页网站设计--卡通的萌王游戏网页(13页) HTML+CSS+JavaScript 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. ...

  5. 大数据文字游戏_基于大数据的游戏化教学系统研究.docx

    基于大数据的游戏化教学系统研究 ―.引言 目前,我国高校在线开放课程的建设已经取得了较大的发展,在线课程的使用已经使高 校教学发生了巨大的变化.课程的网络资源可以作为延伸课堂教学的工具,有效减轻了课堂 ...

  6. html 转盘游戏开发,【scratch】简单的大转盘小游戏

    彩色大转盘 大家是否在各种饭店.商家.网页上看到过大转盘的抽奖活动装置? 对就是这种!!!有各种奖品以及充斥着整个版面50%+的谢谢参与. 我们的小码农也做了一款简单的并且没有(大概)谢谢参与的大转盘 ...

  7. 十大笔记本电脑排行_2020双十一,十大高性价比游戏笔记本电脑值得买排行榜之搭载144Hz电竞屏机型(配置推荐)福利放送...

    最新文章已更新20201028,戳下方⏬文章链接看最新排行 Leo Leung:双十一更新,预算万元以下144Hz广色域电竞屏游戏笔记本电脑十大高性价比机型排行榜.福利放送!​zhuanlan.zhi ...

  8. ★「C++游戏」BattleOfPhantom:大乱斗游戏升级版

    (原创) 目前正在不断更新! ★ 一款超级有趣的大乱斗游戏,包含多种游戏模式,支持双人联机. 离线情况下也可以与多个(或一群)机器玩家进行疯狂的对战. 直接上图 使用C++ with EGE图形库编写 ...

  9. HTML5期末大作业:游戏网页网站设计——CCG-游戏网页介绍(6页)高质量 HTML+CSS+JavaScript

    HTML5期末大作业:游戏网页网站设计--CCG-游戏网页介绍(6页)高质量 HTML+CSS+JavaScript 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电 ...

最新文章

  1. RHEL5(CentOS)下nginx+php+mysql+tomcat+memchached配置全过程(转)
  2. v9 推荐位 排序问题解决办法
  3. 一页纸项目管理模板_项目管理职场必备读物!这一次全部送给你!
  4. iOS 切换首页-更改tabbar的容器控制器
  5. 【Zookeeper】cnxn.saslServer is null cnxn object did not init its saslServer properly
  6. 20155230 2016-2017-2《Java程序设计》课程总结
  7. 结构等待队列[网络编程]select流程分析
  8. linux虚拟机的密钥,Linux虚拟机之间实现密钥登陆
  9. pscad仿真数据提取方法
  10. 数学-泰勒展开和拉格朗日
  11. 安卓linux开机画面,安卓开机画面_安卓开机动画修改_安卓开机动画修改器-Guide信息网...
  12. 如何用matlab画圆环,利用内外径画圆环
  13. There were errors checking the update sites: SSLHandshakeException: sun.secu解决方案
  14. 欢迎IntelliJ IDEA:Maven projects need to be imported: Import Changes Enable Auto-Import
  15. 以人为本的四大用户体验原则
  16. 国产FPGA市场分析 该如何破局
  17. 大型ECShop安装搬家升级错误问题最全攻略
  18. 怎么办理质量管理体系认证证书ISO9001?
  19. 雷军证实小米 13 Ultra 存在;美国最佳雇主百强公布,苹果与 Meta 落榜;Android 13 测实用新功能|极客头条
  20. 计算机切换用户打不开,win10系统无法切换账户且应用打不开的解决方法

热门文章

  1. 安卓各版本市场占有率及特性
  2. Linux CentOS 8(磁盘容量配额(Quota))
  3. GBase 8c支持Foreign Data Wrappers
  4. 数据分析之python数据计算方法汇总(math|numpy|pandas)
  5. Android 图片下载工具类
  6. html显示立方米符号,分享立方米符号怎么打 多种立方米符号打出方法
  7. 牛头刨床c语言编程,牛头刨床C语言模拟.doc
  8. 台湾芯片 制造商新希望
  9. SSL_2382 K好数
  10. 滚动条响应鼠标滑轮事件实现上下滚动的js代码