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) ----------------------------- ...
随机推荐
- Java compiler level does not match the version of the installed java project facet错误的解决
因工作的关系,Eclipse开发的Java项目拷来拷去,有时候会报一个很奇怪的错误.明明源码一模一样,为什么项目复制到另一台机器上,就会报“java compiler level does not m ...
- Python random模块(获取随机数)
1.random.random 随机生成一个0到1的随机浮点数: 0 <= n < 1.0 In [2]: print random.random() 0.544824016934 2.r ...
- Linux - ubuntu读取/root/.profile时发现错误:mesg:ttyname fa
启动ubuntu,以root用户登陆,打开命令行终端 输入命令:#vim /root/.profile 找到.profile文件中的mesg n 将其替换成tty -s && mesg ...
- PL/SQL FAQ in installation "make sure you have the 32 bits Oracle client installed" and "Database character set(AL32UTF8) and Client character set (GBK) are different"
requirement : connecting to remote oracle server . now I know the connectionURL :connectionUrl :jdb ...
- I like NetWorld
liangfengbo.com ibobobo.com https.net.cn bobobo.com.cn scode.net scode.cc liangbolin.com linhe.cc li ...
- python 函数返回多个参数的赋值方法
#定义函数 def Get_Counter_AllMeasureValue(self, inst_dg_address): """ get all measure val ...
- cmd 指令
dir 展示当前文件夹内的文件 mkdir 创建文件夹 c: 访问C盘 (d: f:) cd\ 返回主文件 cd .. 返回上一文件夹 cd test 打开文件夹 访问文件夹 rd 删除文件夹 ...
- Node.js之事件监听和发送
演示事件的发送和监听 const events = require("events"); function Account() { this.balance = 0; events ...
- Windows脚本修改主机名-不重启
windows通过脚本方式修改主机名的方法有很多种,下面介绍修改注册表方式的脚本. 使用方法: 1 打开cmd,假如脚本名为ModifyHostname.bat 2 执行脚本,并加入脚本参数,其中第一 ...
- JVM 自动内存管理:对象判定和回收算法