大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. mysql 中文乱码

  2. Qt出现堆溢出(Error Code -1073741823)

    症状 在使用Debug模式时,程序可以正常启动,但是切换到Release模式,程序报错,错误码-1073741823 原因 程序中使用了过多的new.比如: QActionGroup *mProtoc ...

  3. Linux指令--wget

    Linux系统中的wget是一个下载文件的工具,它用在命令行下.对于Linux用户是必不可少的工具,我们经常要下载一些软件或从远程服务器恢复备份到本地服务器.wget支持HTTP,HTTPS和FTP协 ...

  4. JVM 自动内存管理:对象判定和回收算法

  5. 无废话XML--XML细节

    今天开始研究xml,其实在实际的开发中,我们参与到真正的XML开发并不是很多,最多写一个配置,但是我还是觉得很有必要把XML的知识整理一遍.作为基本的2种的数据交互载体(还有一个是json),基本的X ...

  6. TCP/IP详解 卷1 第二十章 TCP的成块数据流

    先补充一个知识: 1.停止等待协议:是tcp保证传输可靠的重要途径,"停止等待"就是指发送完一个分组就停止发送,等待对方确认之后,才能继续发送下一个分组 停止等待协议的优点是简单, ...

  7. PhpStudy 升级 MySQL 版本到5.7

    1:备份当前数据库数据. 最好是导成 SQL 文件 2:备份 PhpStudy 下的 MySQL 文件夹.以防升级失败.还可以使用旧版本的数据库 3:下载MySQL5.7.解压.然后放在 PhpStu ...

  8. java 网络编程之TCP通信和简单的文件上传功能

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  9. 【转】C++易混知识点5:实例讲解Public Protected Private作用域,继承的区别和用意

    大学生涯,涉及到类的作用域,继承都是用的public 共有继承,当时也没想那么多,觉得共有继承多方便,多简单,反正没有太多的限制,不管是类的成员或者是基类的成员函数都可以访问.没有深究.其实这里面真是 ...

  10. 【转】linux shell 逻辑运算符、逻辑表达式

    shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决很多复杂的判断. 一.逻辑运算符  逻辑卷标表示意思 1.关于档案与目录的侦测逻辑卷标! -f常用!侦测‘档案’是否存在 eg: ...