大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

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.

HINT

 

Source

 
题解
    发现距离具有单调性质,所以可以想到单调性,将xi,xj抽象成一条线段,
    发现当两条线段有交集的时候并且,距离满足条件时是可以转移的,
    那么如何思考呢?
    发现可以将xi,xj离散化,这样的话,就可以在线段树一段区间中寻找最小值,
    但是出现一个问题,最小值是不能够删除的,就是距离不满足了,怎么删除
    无法做到,所以需要在每个点中开一个单调队列,这才是这道题目的难点。
    
    先了解一个概念,什么叫做永久性flag,对于普通的flag,是不是需要标记下传
    也就是说,标记不是固定的,二永久性标记,顾名思义就是不需要下传标记,
        

    比如红色线段是需要寻找的,那么对于包括这条线段的,并且是满足整条线段包括的

    我的代码中分为一个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)的更多相关文章

  1. BZOJ 1171: 大sz的游戏

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

  2. BZOJ1171: 大sz的游戏&BZOJ2892: 强袭作战

    Description 大sz最近在玩一个由星球大战改编的游戏.话说绝地武士当前共控制了N个星球.但是,西斯正在暗处悄悄地准备他们的复仇计划.绝地评议会也感觉到了这件事.于是,准备加派绝地武士到各星球 ...

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

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

  4. BZOJ 1012 线段树||单调队列

    非常裸的线段树  || 单调队列: 假设一个节点在队列中既没有时间优势(早点入队)也没有值优势(值更大),那么显然不管在如何的情况下都不会被选为最大值. 既然它仅仅在末尾选.那么自然能够满足以上的条件 ...

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

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

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

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

  7. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

  8. 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 ...

  9. BZOJ 3207: 花神的嘲讽计划Ⅰ( hash + 可持久化线段树 )

    O(NK)暴力搞出所有子串的哈希值, 然后就对哈希值离散化建权值线段树, 就是主席树的经典做法了.总时间复杂度O(NK+(N+Q)logN) ----------------------------- ...

随机推荐

  1. 使用git bash提交代码到github托管

    1.首先登录到https://github.com注册Github帐号,并且创建一个repository.  或者登录到  https://git.oschina.net/注册账号,并且创建一个rep ...

  2. jQuery时间格式插件-moment.js的使用

    jQuery时间格式插件-moment.js的使用 moment.js插件的使用,使用之前在页面引入对应的js文件: 详细的操作可见moment中文官网:http://momentjs.cn/ 日期格 ...

  3. elasticsearch安装ik分词器

    一.概要: 1.es默认的分词器对中文支持不好,会分割成一个个的汉字.ik分词器对中文的支持要好一些,主要由两种模式:ik_smart和ik_max_word 2.环境 操作系统:centos es版 ...

  4. vs2005配置OpenCv2.3.1

    编译OpenCv 1 用CMake导出VC++项目文件 运行cmake-gui,设置where is the source code路径为OpenCV安装路径(本文档假定安装位置为:c:\OpenCV ...

  5. nginx服务器的作用与简单搭建(windows)

    Nginx是一款开源代码的反向代理服务器. 何为反向代理呢?即以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连 ...

  6. CentOS 7 修改SSH端口号 和 ssh无法使用密码登录 和 查看pid 端口占用

    如下示例把SSH默认端口22改为122. 1 修改/etc/ssh/sshd_config文件 #Port #找到改行,如果还想继续使用该端口,可以把#去掉,如果使用新端口,可以默认不管 Port # ...

  7. <%@include file="a.jsp"%> jsp引用jsp文件时候注意

    被包含的a.jsp文件:    a.jsp文件的page指令要么不要写.要么与主jsp文件的page指令一样.

  8. android 监听返回键

    android监听返回键 public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE ...

  9. 【转】 awk 学习笔记

    本文参考的是 ubuntu 下 gawk version 3.1.6 以及 <sed&awk> 一 . awk 简介 awk 是一种解释型(tawk除外)文本处理语言 二 . aw ...

  10. Macaca拓展自己控件的方法

    https://github.com/macacajs/wd.py/blob/3bc4334bcb68733cb230b59d6164110053fd1c16/tests/macaca/test_ut ...