很好的题解:http://blog.sina.com.cn/s/blog_76f6777d0101dizp.html

“考虑裸的n^2暴力dp. dp[i]=min(dp[j])+1 ( d[i]-d[j]<=L && [xi,yi]∪[xj,yj]!=∅)

由于第二个相对较难处理,首先考虑它.  把x,y离散化后搞个线段树,支持插入删除一个区间的答案,并且询问区间的答案即可.

关于如何维护区间里的答案,虽然答案是有可能被删除的,但由于满足单调性,考虑在区间里套个单调队列.

具体来说,for 循环到i,删掉一些dist大于L的区间答案,再到线段树中去询问至少覆盖了[xi,yi]的其中一部分的最小答案,用之求得dp[i],再在线段树[xi,yi]插入dp[i]这个答案.  单调队列实在是比较显然,就不说了.

但是要注意这里的线段树是不大方便用lazy下传的,而且到达能被其完全覆盖的区间节点就插入,不再往下做了.

这样保证了时间和空间复杂度为o(nlogn),因为每个星球的区间对应的线段树中的区间节点大概是logn个,该区间的dp值只能被插入到这~logn个单调队列里.  blah的.

并且这样,完全覆盖了某个区间节点的最小值,应该是其到根节点路径上所有单调队列维护的值的最小值.

然,至少覆盖了某区间一部分的最小值,即为完全覆盖该区间子区间(包括本身)的最小值  的最小值.  如果这是个线段树上的区间节点的话,即为其子树中的所有节点到根的最小值,即为子树到该节点的最小值和该节点到根的最小值.  前者显然用 val[cur]=min(val[cur],val[lson],val[rson]) 维护即可. 后者询问时顺便维护即可.”

#include<cstdio>
#include<cstdlib>
#include<list>
#include<algorithm>
#define oo (1<<30)
using namespace std;inline char nc()
{static char buf[100000],*p1=buf,*p2=buf;if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }return *p1++;
}inline void read (int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') c=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}const int N=250005;int sx[2*N],icnt;inline int Bin(int x){return lower_bound(sx+1,sx+icnt+1,x)-sx;
}int val[N*8];
list<int> Lis[N*8];int n,L;
int d[N],x[N],y[N];
int dp[N];
int Q[N],l,r;void build(int rt,int l,int r){val[rt]=oo;int mid=(l+r)>>1;if (l!=r)build(rt<<1,l,mid),build(rt<<1|1,mid+1,r);
}inline int get(int rt)
{return !Lis[rt].empty()?dp[Lis[rt].front()]:oo;
}void modify(int k,int rt,int l,int r,int L,int R,int pos)
{if (L<=l && r<=R){if (k){while (!Lis[rt].empty() && Lis[rt].front()<=pos) Lis[rt].pop_front();}else{while (!Lis[rt].empty() && dp[pos]<=dp[Lis[rt].back()]) Lis[rt].pop_back();Lis[rt].push_back(pos);}}else{int mid=(l+r)>>1;if (R<=mid) modify(k,rt<<1,l,mid,L,R,pos);else if (L>mid) modify(k,rt<<1|1,mid+1,r,L,R,pos);else{modify(k,rt<<1,l,mid,L,mid,pos);modify(k,rt<<1|1,mid+1,r,mid+1,R,pos);}}val[rt]=min(get(rt),(l==r)?oo:min(val[rt<<1],val[rt<<1|1]));
}int query(int rt,int l,int r,int L,int R)
{if (R<l || L>r) return oo;if (L<=l && r<=R) return val[rt];int ret=get(rt);if (l!=r){int mid=(l+r)>>1;ret=min(ret,query(rt<<1,l,mid,L,R));ret=min(ret,query(rt<<1|1,mid+1,r,L,R));} return ret;
}int main()
{freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(n); read(L);for (int i=1;i<n;i++){read(x[i]),read(y[i]),read(d[i]);sx[++icnt]=x[i]; sx[++icnt]=y[i];}sort(sx+1,sx+icnt+1);icnt=unique(sx+1,sx+icnt+1)-sx-1;for (int i=1;i<n;i++)x[i]=Bin(x[i]),y[i]=Bin(y[i]);build(1,1,icnt);x[0]=1; y[0]=icnt;l=r=-1; dp[0]=d[0]=0;Q[++r]=0;modify(0,1,1,icnt,x[0],y[0],0);for (int i=1;i<n;i++){while (l<r && d[i]-d[Q[l+1]]>L) {int u=Q[++l];modify(1,1,1,icnt,x[u],y[u],u);}dp[i]=query(1,1,icnt,x[i],y[i]);if (dp[i]!=oo){printf("%d\n",++dp[i]);modify(0,1,1,icnt,x[i],y[i],i);Q[++r]=i;}else{printf("-1\n");}}return 0;
}

[线段树 标记永久化 单调队列] BZOJ 1171 大sz的游戏 BZOJ 2892 强袭作战相关推荐

  1. bzoj 1171: 大sz的游戏, bzoj 2892: 强袭作战

    标记永久化,线段树套单调队列. 标记永久化的好处在于可以减少下传标记的时间. 如果有些标记很难下传,但是打标记的顺序对结果没有影响,就可以用标记永久化 比如说 支持矩阵加.矩阵求和就可以用带标记永久化 ...

  2. CodeForces - 1418G Three Occurrences(线段树-标记永久化)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a ,现在规定 a 中的一段区间 [ l , r ],如果其中每个数字要么出现 0 次要么出现恰好 3 次,就规定这是个好区间,问共有多少个好 ...

  3. 模板:线段树标记永久化

    为了那不可知的询问永远坚守于此 解析 众所周知线段树的区间修改是需要打懒标记的 多数时候,这个标记在询问子区间时需要下传 而标记永久化,就是指不下传懒标记的一种操作 在某些时候标记不便下传时有所应用 ...

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

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

  5. 19.CF803G Periodic RMQ Problem 线段树+分块+线段树标记

    19.CF803G Periodic RMQ Problem 线段树+分块+线段树标记 个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客 ...

  6. BZOJ 1396:识别子串 SA+树状数组+单调队列

    1396: 识别子串 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 381  Solved: 243 [Submit][Status][Discus ...

  7. 2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)

    题目链接:点击查看 题目大意:给出两棵以点 111 为根节点的有根树,现在要求满足条件的最大集合: 在第一棵树中,集合内的任意两个点都必须满足祖先关系,即 uuu 是 vvv 的祖先或 vvv 是 u ...

  8. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...

  9. cactus仙人掌图【仙人掌圆方树+树形DP+单调队列】

    题目链接 BZOJ 1023 首先,圆方树是比较好想到的,维护直径,我们最方便的做法就是先让它变成一棵树,这里因为是仙人掌图,所以就用圆方树来构建. 再者,就是维护直径了,比较好想到的是非环上结点,就 ...

最新文章

  1. Java 25 岁,发展现状大曝光!程序员的机会来了
  2. android开发岗_android应用开发
  3. 边锋游戏:用精细化运营使游戏流失率降低 26% ,只是数据驱动价值的冰山一角...
  4. ES6-Generator使用与改写
  5. 多层GCN的over-smooth问题
  6. 2.2 The Environment Abstraction Layer (EAL)
  7. Hive 执行计划之Reduce Output Operator
  8. 几个阿里,美团,腾讯大佬的公众号!超级变态!
  9. linux下修改防火墙端口对外开放方法
  10. IT加速营-关于java开发,测试及职业规划的公众号
  11. js汉字到linux乱码,完美解决JS中汉字显示乱码问题(已解决)
  12. 阿里巴巴《Java开发手册(黄山版)》阅读笔记
  13. OpenKG开源系列 | 轻量级知识图谱抽取开源工具OpenUE
  14. Js基础引导(二)——语法
  15. 不是你不懂黑盒攻击,而是你还不懂SurFree
  16. Python——类和实例
  17. 云服务器系统一键安装,一键安装服务器系统
  18. WPF管理平台 (一)- 登录页面
  19. seaweedfs 调研
  20. UBOOT I2C读写详解(基于mini2440)

热门文章

  1. OC callback
  2. Professional C# 6 and .NET Core 1.0 - Chapter 41 ASP.NET MVC
  3. 图形学/OpenGL/3D数学/Unity
  4. 就在刚刚这份java八股文成功让我进入字节,拿到了人生第一个18k
  5. 为什么有些人一游泳就双眼通红?这两点没做好你也会!
  6. OCAD应用:光楔初始设计
  7. ufs2.2 协议扫盲(十一)
  8. 展会推广有哪些好的创意 怎样让展会推广更有创意
  9. python实现百万英雄答题神器
  10. 用计算机弹起风了歌词,起风了歌词(买辣椒也用券演唱)