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) ----------------------------- ...
随机推荐
- Oracle内连接、外连接、右外连接、全外连接小总结
数据库版本:Oracle 9i 表TESTA,TESTB,TESTC,各有A, B两列 A B 001 10A 002 20A A B 001 10B 003 30B A B 001 10C 004 ...
- impala集成sentry
1.安装配置sentry 详细步骤见上一篇安装配置sentry. 2.配置impala 注:以下配置未集成kerberos安全认证 在/etc/imapla/conf目录下创建sentry-site. ...
- video.js不能控制本地视频或者音频播放时长
问题: 把视频放到本地,然后对视频进行测试,想要控制视频或者音频的播放时长,没办法做到,每次拉动进度条,都会使得本地视频重新播放 原因: 所有浏览器默认js无法访问本地地址,也就是说js不能对本地文件 ...
- java1.8--Optional类
身为一名Java程序员,大家可能都有这样的经历:调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法.我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数. ...
- 一、Python表达式基础
Python 能执行简单的计算器的功能: 如>>2+2 ==> 4,1/2==>0.5或者这样写1/2.0==>0.5(取浮点型) 1//2 ==>0 (" ...
- spring boot热部署
1.pom配置 参考:http://412887952-qq-com.iteye.com/blog/2300313 2.intellij配置 参考:http://blog.csdn.net/wjc47 ...
- ATS缓存数据结构
ATS缓存数据结构 HttpTunnel类 数据传输驱动器(data transfer driver),包含一个生产者(producer)集合,每个生产者连接到一个或是多个消费者(comsumer). ...
- Linux学习笔记一
本文记录了Linux中常用的一些东西. 命令生效顺序 第一顺位执行绝对路径或者相对路径的命令 第二顺位执行别名 第三顺位执行Bash的内部命令 第四顺位执行按照$PATH环境变量设置定义的目录顺序的第 ...
- Snort初探
Snort初探 概念: Snort是一款开源的网络入侵防御系统(IPS),可以实时分析和记录网络数据包,你可以通过执行协议分析.内容搜索和匹配,从而发现各种网络攻击和可疑的探测.例如,缓冲区溢出.端口 ...
- SpringMVC源码情操陶冶-DispatcherServlet简析(二)
承接前文SpringMVC源码情操陶冶-DispatcherServlet类简析(一),主要讲述初始化的操作,本文将简单介绍springmvc如何处理请求 DispatcherServlet#doDi ...