2892: 强袭作战

Time Limit: 50 Sec  Memory Limit: 512 MB
Submit: 45  Solved: 30
[Submit][Status][Discuss]

Description

在一个没有冬马的世界里,经历了学园祭后的春希着急着想要见到心爱的雪菜。然而在排队想见雪菜的fans太多了,春希一时半会凑不到雪菜面前。
作为高帅富,这样的问题怎么能难倒春希?春希从武也手中拿到了取自金闪闪宝库里的多啦A梦的传话筒,并且给每一个排队的fans都发了一个传话筒。
于是现在有N个人排成一列,第一个人是雪菜,后面N个人是雪菜的fans。第I个fan能在他的左侧中选一个距离不超过L的人发出频率在[xi,yi]的音波,并且第I个fan也能接受频率在[xi,yi]的音波。特别的,雪菜能接受所有频率的音波。
春希有些话想通过传话筒告诉雪菜,他想选择一个人作为传话的起始点,但不知道选谁比较好,作为春希的好友的你,能告诉他答案吗?
传话的具体解释:第I个人能选择其左边的距离不超过L的一个人J,只要双方对应的区间有交集,那么第I个人就能将信息传达给J。然后J又可以继续找下一个人传达信息。传达一次信息要1单位时间。

Input

第一行两个正整数N、L。接下来N-1行,第i行包含了三个正整数xiyili,其中li表示第i个人距离雪菜有li的距离,满足li严格递增。

Output

总共N-1行,每行一个数分别表示2到N号fan至少需要多少单位时间,雪菜才能收到信息,如果无法传到雪菜则输出-1。

Sample Input

3 1
1 2 1
2 3 2

Sample Output

1
2
【数据规模和约定】
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

1171: 大sz的游戏

Time Limit: 50 Sec  Memory Limit: 357 MB
Submit: 320  Solved: 98
[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

By 俞华程

Solution

线段树标记永久化+单调队列+DP

首先一眼DP:  $dp[i]=min(dp[j])+1$ 其中 $\left | l[i]-l[j] \right |<L,\left [ x[i],y[i] \right ]\bigcap \left [ x[j],y[j] \right ]\neq \O $

那么需要优化复杂度,考虑利用数据结构(可以利用很多种,这里选用权值线段树+单调队列)

x[],y[]范围过大,单很稀疏,离散,建权值线段树,支持区间修改区间查询;维护区间中的答案,需要在区间中加入一个单调队列

发现标记不适合下传,即标记需要永久化,和之前维护直线的思想类似,这样复杂度就一样能保证在$O(nlogn)$

如果当前区间完全覆盖,则不需要下传;维护的最小值,即区间的单调队列队首,和左右区间的最小三者取最小

查询的时候查询有交集的所有区间,线段树中节点的信息只是维护了完全包含于这个区间的区间的信息,我们还需要知道和这个区间有交集的但不包含于这个区间的信息,所以往子树递归的时候把路径上的信息也一块统计就好啦。

总结:

1.标记永久化的思想更加加深

2.对于类似这样的单调的问题,同样可以用线段树去维护,据说类似问题线段树是比CDQ之类还要无敌的??

3.对于每个线段树区间套上单调队列时,容易爆,开始手写单调队列,炸编译,改成动态RE,所以可以考虑用<list>

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<list>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-')f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define maxn 250010
#define inf 0x7fffffff
int N,L,tot,ls[maxn<<],val[maxn<<],dp[maxn],que[maxn],x[maxn],y[maxn],l[maxn];
struct DQueueNode{list<int>q;}Tree[maxn<<];
int Get(int now) {return !Tree[now].q.empty()?dp[Tree[now].q.front()]:inf;}
void update(int now,int l,int r) {val[now]=min(Get(now),(l==r)?inf:min(val[now<<],val[now<<|]));}
void Build(int now,int l,int r)
{
val[now]=inf;
if (l==r) return;
int mid=(l+r)>>;
Build(now<<,l,mid); Build(now<<|,mid+,r);
}
void Insert(int now,int l,int r,int L,int R,int x,int f)
{
if (L<=l && R>=r)
{
if (f) while (!Tree[now].q.empty() && Tree[now].q.front()<=x) Tree[now].q.pop_front();
else {while (!Tree[now].q.empty() && dp[Tree[now].q.back()]>=dp[x]) Tree[now].q.pop_back(); Tree[now].q.push_back(x);}
update(now,l,r);
return;
}
int mid=(l+r)>>;
if (L<=mid) Insert(now<<,l,mid,L,R,x,f);
if (R>mid) Insert(now<<|,mid+,r,L,R,x,f);
update(now,l,r);
}
int Query(int now,int l,int r,int L,int R)
{
if (L<=l && R>=r) return val[now];
int mid=(l+r)>>,re=Get(now);
if (L<=mid) re=min(re,Query(now<<,l,mid,L,R));
if (R>mid) re=min(re,Query(now<<|,mid+,r,L,R));
return re;
}
int main()
{
N=read(),L=read();
for (int i=; i<=N-; i++) ls[++tot]=x[i]=read(),ls[++tot]=y[i]=read(),l[i]=read();
sort(ls+,ls+tot+);
int Tot=; for (int i=; i<=tot; i++) if (ls[i]!=ls[i-]) ls[++Tot]=ls[i];
for (int i=; i<=N-; i++) x[i]=lower_bound(ls+,ls+Tot+,x[i])-ls,y[i]=lower_bound(ls+,ls+Tot+,y[i])-ls;
Tot=unique(ls+,ls+Tot+)-ls-;
// for (int i=1; i<=N-1; i++) printf("%d %d\n",x[i],y[i]);
Build(,,Tot);
int he=-,ta=-; dp[]=; x[]=,y[]=Tot; que[++ta]=;
Insert(,,Tot,x[],y[],,);
for (int i=; i<=N-; i++)
{
int tmp;
while (he<ta && l[i]-l[que[he+]]>L) tmp=que[++he],Insert(,,Tot,x[tmp],y[tmp],tmp,);
dp[i]=Query(,,Tot,x[i],y[i])+;
if (dp[i]!=inf+) printf("%d\n",dp[i]),que[++ta]=i,Insert(,,Tot,x[i],y[i],i,);
else puts("-1");
}
return ;
}

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

  1. [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)

    [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...

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

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

  3. 动态求区间K大值(权值线段树)

    我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...

  4. BZOJ 4777 Usaco2017 Open Switch Grass Kruskal+替罪羊树+权值线段树

    这道题首先可以看出答案一定是一条边,而且答案一定在最小生成树上,那么我们就可以在这个最小生成树上维护他与异色儿子的边最小值,所以我们就可以已通过Kruskal和一棵平衡树来解决,时间复杂度是O(n*l ...

  5. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  6. BZOJ 3110 ZJOI 2013 K大数查询 树套树(权值线段树套区间线段树)

    题目大意:有一些位置.这些位置上能够放若干个数字. 如今有两种操作. 1.在区间l到r上加入一个数字x 2.求出l到r上的第k大的数字是什么 思路:这样的题一看就是树套树,关键是怎么套,怎么写.(话说 ...

  7. BZOJ 4605 崂山白花蛇草水(权值线段树+KD树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4605 [题目大意] 操作 1 x y k 表示在点(x,y)上放置k个物品, 操作 2 ...

  8. bzoj 4627: [BeiJing2016]回转寿司 -- 权值线段树

    4627: [BeiJing2016]回转寿司 Time Limit: 10 Sec  Memory Limit: 256 MB Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店. ...

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

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

随机推荐

  1. linux svn

    1.回滚 一直在找svn回滚的方法,这个还是很实用的,屡试不爽阿 经常由于坑爹的需求,功能要切回到之前的某一个版本.有两种方法可以实现: 方法1: 用svn merge  1) 先 svn up,保证 ...

  2. 【MySql】C#数据库备份与还原

    public static class SQLBackup { /// <summary> /// 执行Cmd命令 /// </summary> /// <param n ...

  3. mongodb.conf配置文件详解

    mongod --config /etc/mongodb.conf 配置如下:verbose:日志信息冗余.默认false.提高内部报告标准输出或记录到logpath配置的日志文件中.要启用verbo ...

  4. Hangfire项目实践

    Hangfire项目实践分享 Hangfire项目实践分享 目录 Hangfire项目实践分享 目录 什么是Hangfire Hangfire基础 基于队列的任务处理(Fire-and-forget ...

  5. 直流调速系统Modelica基本模型

    为了便于在OpenModelica进行仿真,形成一个完整的仿真模型,没有使用第三方的库,参照了DrModelica的例程,按照Modelica库的开源模型定义了所用的基本元件模型. 首先给出一些基本类 ...

  6. 品读吴军"之"系列

    品读吴军"之"系列 这一两年,阅读吴军老师(微博,知乎专栏)的书占了我相当多的时间. 读吴军老师(微博,知乎专栏)的书,会让你心生敬佩,不禁想问"为什么有的作者有如此丰富 ...

  7. 用 Smarty 生成静态页面入门介绍

    why Smarty? 随着公司首页(以下简称首页)流量越来越大,最近开始考虑使用后台语言生成静态页面的技术. 我们知道,一个简单页面一般是一个 .html(或者 .htm ..shtml)后缀的文件 ...

  8. xml入门

    1.why xml? 如果说JSON是一种轻量级的数据交换格式,那么xml就是重量级的.xml应用于web开发的许多方面,常用于简化数据的存储和共享.永远要记住,xml跟JSON一样是用来存储和传输数 ...

  9. 一步一步学习ABP项目系列文章目录

    1.概述 基于DDD的.NET开发框架 - ABP初探 基于DDD的.NET开发框架 - ABP分层设计 基于DDD的.NET开发框架 - ABP模块设计 基于DDD的.NET开发框架 - ABP启动 ...

  10. 理解AngularJS生命周期:利用ng-repeat动态解析自定义directive

    ng-repeat是AngularJS中一个非常重要和有意思的directive,常见的用法之一是将某种自定义directive和ng-repeat一起使用,循环地来渲染开发者所需要的组件.比如现在有 ...