bzoj 1171 大sz的游戏& 2892 强袭作战 (线段树+单调队列+永久性flag)
大sz的游戏
Time Limit: 50 Sec Memory Limit: 357 MB
Submit: 536 Solved: 143
[Submit][Status][Discuss]
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
3 1
1 2 1
2 3 2
input 2
3 3
1 2 1
2 3 2
Sample Output
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.
HINT
Source
题解
比如红色线段是需要寻找的,那么对于包括这条线段的,并且是满足整条线段包括的
我的代码中分为一个tr与一个bj数组,
tr数组的意思是刚好完全包括这一段的,一个值,
而bj表示子区间中含有这一段的,
那么,在寻找中,如果被tr包括,tr可以直接更新,因为这段全部都是满足的。
如果当前寻找的这一段是包括了bj那么bj中有子区间的值也一定被寻找段包括,所以可以更新,
这样更新前维护单调性即可。
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<map>
#include<list> #define N 2000007
#define inf 1000000007
#define fzy pair<int,int>
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,L,num,siz;
int hd,tl,q[N],b[N],f[N];
struct Node
{
int x,y,l;
}a[N];
list<fzy>tr[N],bj[N];
map<int,int>p; void ins(int p,int l,int r,int x,int y,fzy zhi)
{
if (x<=l&&r<=y)
{
while(!tr[p].empty()&&tr[p].back().second>=zhi.second)
tr[p].pop_back();
tr[p].push_back(zhi);
return;
} while(!bj[p].empty()&&bj[p].back().second>=zhi.second)
bj[p].pop_back();
bj[p].push_back(zhi); int mid=(l+r)>>;
if (y<=mid) ins(p<<,l,mid,x,y,zhi);
else if (x>mid) ins(p<<|,mid+,r,x,y,zhi);
else ins(p<<,l,mid,x,mid,zhi),ins(p<<|,mid+,r,mid+,y,zhi);
}
int query(int p,int l,int r,int x,int y,int wei)
{
int res; while(wei-tr[p].front().first>L&&!tr[p].empty())
tr[p].pop_front();
if (tr[p].empty()) res=inf;
else res=tr[p].front().second; while(wei-bj[p].front().first>L&&!bj[p].empty()) bj[p].pop_front();
if (x<=l&&r<=y)
{
if (!bj[p].empty()) res=min(res,bj[p].front().second);
return res;
} int mid=(l+r)>>;
if (y<=mid) res=min(res,query(p<<,l,mid,x,y,wei));
else if (x>mid) res=min(res,query(p<<|,mid+,r,x,y,wei));
else res=min(res,min(query(p<<,l,mid,x,mid,wei),query(p<<|,mid+,r,mid+,y,wei)));
return res;
}
int main()
{
n=read(),L=read();
for (int i=;i<n;i++)
a[i].x=read(),a[i].y=read(),a[i].l=read(),b[++num]=a[i].x,b[++num]=a[i].y;
sort(b+,b+num+);
for (int i=;i<=num;i++)
if (b[i]!=b[i-]) p[b[i]]=++siz;
for (int i=;i<n;i++)
a[i].x=p[a[i].x],a[i].y=p[a[i].y]; ins(,,siz,,siz,make_pair(,));
for (int i=;i<n;i++)
{
f[i]=query(,,siz,a[i].x,a[i].y,a[i].l)+;
ins(,,siz,a[i].x,a[i].y,make_pair(a[i].l,f[i]));
}
for (int i=;i<n;i++)
printf("%d\n",f[i]>=n?-:f[i]);
}
bzoj 1171 大sz的游戏& 2892 强袭作战 (线段树+单调队列+永久性flag)的更多相关文章
- BZOJ 1171: 大sz的游戏
ZJOI讲课的题目,数据结构什么的还是很友好的说 首先我们发现题目中提到的距离\(\le L\)的东西显然可以用单调队列维护 但是暴力搞去不掉区间并的限制,那么我们考虑从区间并入手 对于这种问题的套路 ...
- BZOJ1171: 大sz的游戏&BZOJ2892: 强袭作战
Description 大sz最近在玩一个由星球大战改编的游戏.话说绝地武士当前共控制了N个星球.但是,西斯正在暗处悄悄地准备他们的复仇计划.绝地评议会也感觉到了这件事.于是,准备加派绝地武士到各星球 ...
- 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP
2892: 强袭作战 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 45 Solved: 30[Submit][Status][Discuss] D ...
- BZOJ 1012 线段树||单调队列
非常裸的线段树 || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件 ...
- 【BZOJ1171】大sz的游戏(线段树+单调队列)
点此看题面 大致题意: 有\(n\)个点,两点间最大通讯距离为\(L\).已知除\(1\)号点外第\(i\)个点能够发出和接收的信号区间\([l_i,r_i]\)以及到\(1\)号点的距离\(dis_ ...
- [BZOJ1171][BZOJ2892]大sz的游戏
[BZOJ1171][BZOJ2892]大sz的游戏 试题描述 大sz最近在玩一个由星球大战改编的游戏.话说绝地武士当前共控制了N个星球.但是,西斯正在暗处悄悄地准备他们的复仇计划.绝地评议会也感觉到 ...
- BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...
- BZOJ 2588: Spoj 10628. Count on a tree-可持久化线段树+LCA(点权)(树上的操作) 无语(为什么我的LCA的板子不对)
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 9280 Solved: 2421 ...
- BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )
O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...
随机推荐
- django 编程小结
1.增删改查 add obj = Obj(atr=atr..) obj.save() update: __dict__ 遍历 del: 根据id列表删除 query: 首次查询: 直接跳转至页面,前端 ...
- springmvc +mybatis 配置多数据源
1.数据源配置: jdbc_multiple.properties: # MySQL #======================================================== ...
- 新手数据比赛中数据处理方法小结(python)
第一次参加,天池大数据竞赛(血糖预测),初赛排名1%.因为自己对python不熟悉,所以记录一下在比赛中用到的一些python方法的使用(比较基础细节,大佬绕道): 1.数据初探 data.info( ...
- mybatis实战教程三:多对多关联
MyBatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作 一.创建student.te ...
- 解决页面引用百度地图API设置点的logo不显示问题
在写css时需要引用一个百度的api地图,却发现设置点的logo图片不能显示,后查阅百度测试发现是图片路径的问题: 在引用的下载的html页面找到 var icon = new BMap.Icon 将 ...
- Linux批量ping脚本
根据鸟哥的ping脚本,我重新修改了一下.用到的知识有:read.Linux按行读取.shell输出效果调整等 其中Linux按行读取文件比较重要,可参看文下链接 1 脚本功能: 批量ping当前路径 ...
- jdk源码->多线程->Thread
线程的创建 java提供了三种创建线程的方法: 通过继承 Thread 类本身: 通过实现 Runnable 接口: 通过 Callable 和 Future 创建线程. 继承Thread类 步骤: ...
- awk 指定{}内x的替换
替换{}中的x为; 原字符串 oxo{axbxc}oxo{dxexf}oxo 结果 oxo{a;b;c}oxo{d;e;f}oxo awk '{for(i=1;i<=NF;i++){ ...
- Notepad++运行Java
插件NppExec使用 首先要让Notepad++编译和运行Java,前提是电脑里已经配置好了Java的环境 1,安装插件NppExec:解压出来提取NppExec.dll文件放在Notepad++安 ...
- HARBOR 仓库 API功能接口
1 项目管理 1.1 查看仓库中项目详细信息 curl -u "admin:Harbor12345" -X GET -H "Content-Type: ...