【NOI2019】弹跳【二维线段树】【dijkstra】

题意:一个w×hw\times hw×h的二维平面上有nnn个城市,有mmm个弹跳装置,第iii个可以花费tit_iti的时间从城市pip_ipi跳到矩形x∈[l,r],y∈[u,d]x\in [l,r],y\in[u,d]x[l,r],y[u,d]中的任意一个城市。求从111到其他每个城市的最小时间。

w,h≤n≤7×104,m≤1.5×105w,h\leq n\leq7\times 10^4,m\leq1.5\times10^5w,hn7×104,m1.5×105 空间限制128M

考虑直接套dijkstra的思路,每次选出dis最小的点,松弛它可以到的点,然后把它删掉。

挪到二维平面上,你需要支持:

  1. 全局询问最小值
  2. 矩形取min⁡\minmin
  3. 删除一个点

用kdt或者二维线段树维护即可。这里用的是二维线段树。

需要注意的细节:

  1. 要动态开点
  2. 要用pair记录最小值的编号,且初值是(INF,INF),否则可能打了个lazy标记之后first是答案标号却是0。
  3. 大常数选手需要维护一个最大值剪枝。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#include <utility>
#define re register
#define MAXN 70005
using namespace std;
const int INF=0x7fffffff;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
typedef pair<int,int> pi;
#define mp make_pair
#define fi first
#define se second
struct tran{int xl,xr,yl,yr;tran(int xl=0,int xr=0,int yl=0,int yr=0):xl(xl),xr(xr),yl(yl),yr(yr){}};
inline bool belong(const tran& b,const tran& a){return a.xl<=b.xl&&b.xr<=a.xr&&a.yl<=b.yl&&b.yr<=a.yr;}
inline bool ninter(const tran& a,const tran& b){return (a.xr<b.xl||b.xr<a.xl)||(a.yr<b.yl||b.yr<a.yl);}
struct edge{tran t;int w;};
vector<edge> e[MAXN];
#define ch(x) t[p].son[x]
int tot=0,rt;
struct node{tran pos;pi mn;int mx,sum,lzy,son[4];}t[MAXN<<5];
inline int newnode(int xl,int xr,int yl,int yr)
{int p=++tot;t[p].pos=tran(xl,xr,yl,yr);t[p].mn=mp(INF,INF);t[p].mx=0;t[p].lzy=INF;return p;
}
inline void update(int p)
{t[p].sum=t[ch(0)].sum+t[ch(1)].sum+t[ch(2)].sum+t[ch(3)].sum;t[p].mn=mp(INF,INF),t[p].mx=0;for (re int i=0;i<4;++i) if (ch(i)) t[p].mn=min(t[p].mn,t[ch(i)].mn),t[p].mx=max(t[p].mx,t[ch(i)].mx);
}
inline void pushlzy(int p,int v)
{if (t[p].sum==0) return;t[p].mn.fi=min(t[p].mn.fi,v),t[p].mx=min(t[p].mx,v),t[p].lzy=min(t[p].lzy,v);
}
inline void pushdown(int p)
{if (t[p].lzy<INF){for (re int i=0;i<4;++i) pushlzy(ch(i),t[p].lzy);t[p].lzy=INF;}
}
void modify(int& p,int xl,int xr,int yl,int yr,int x,int y,int v)
{if (!p) p=newnode(xl,xr,yl,yr);if (!belong(tran(x,x,y,y),t[p].pos)) return;pushdown(p);if (t[p].pos.xl==t[p].pos.xr&&t[p].pos.yl==t[p].pos.yr) return (void)(t[p].sum=(v<INF),t[p].mn=mp(INF,v),t[p].mx=(v==INF? 0:INF));int xmid=(xl+xr)>>1,ymid=(yl+yr)>>1;	modify(ch(0),xl,xmid,yl,ymid,x,y,v);modify(ch(1),xl,xmid,ymid+1,yr,x,y,v);modify(ch(2),xmid+1,xr,yl,ymid,x,y,v);modify(ch(3),xmid+1,xr,ymid+1,yr,x,y,v);		update(p);
}
void modify(int p,tran q,int v)
{if (!p) return;pushdown(p);	if (t[p].mx<=v) return;if (belong(t[p].pos,q)) return pushlzy(p,v);if (ninter(t[p].pos,q)) return;for (int i=0;i<4;i++) modify(ch(i),q,v);update(p);	
}
int x[MAXN],y[MAXN],ans[MAXN];
int main()
{int n,m,w,h;n=read(),m=read(),w=read(),h=read();for (int i=1;i<=n;i++){x[i]=read(),y[i]=read();modify(rt,1,w,1,h,x[i],y[i],i);}for (int i=1;i<=m;i++){int p,t,l,r,d,u;p=read(),t=read(),l=read(),r=read(),d=read(),u=read();e[p].push_back((edge){tran(l,r,d,u),t});}modify(1,tran(x[1],x[1],y[1],y[1]),0);for (int T=1;T<=n;T++){pi tmp=t[1].mn;int u=tmp.se,dis=tmp.fi;ans[u]=dis;for (int i=0;i<(int)e[u].size();i++)modify(1,e[u][i].t,dis+e[u][i].w);modify(rt,1,w,1,h,x[u],y[u],INF);}for (int i=2;i<=n;i++) printf("%d\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Beta Round #51 D. Beautiful numbers 数位dp + 状态优化

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 数位dpdpdp挺经典的一个题辣&#xff0c;有一个很明显的状态就是f[pos][num][lcm]f[pos][num][lcm]f[pos][num][lcm]表示到了第pospospos位&#xff0c;数是numnumnum&#xff0c;个位数最…

在C#中使用Irony实现SQL语句的解析

在上一篇博文 LogoSharp&#xff1a;Logo语言的C#实现中&#xff0c;我介绍了LOGO语言的C#实现&#xff0c;在该项目中&#xff0c;我使用了.NET下的语法解析框架&#xff1a;Irony。Irony框架最开始的时候是由Roman Ivantsov发布在codeplex上的一个开源项目&#xff0c;它使用…

【CF1045A】A Last chance【贪心】【线段树优化建图】【网络流构造方案】

题意&#xff1a;有nnn个武器和mmm个飞船&#xff0c;武器有下面三种 从给定的集合SSS中击破一个。在给定的区间[L,R][L,R][L,R]中击破一个。对于给定的a,b,ca,b,ca,b,c&#xff0c;选择000个或222个击破。特殊地&#xff0c;每个飞船最多被该操作的a,b,ca,b,ca,b,c指定一次。…

P4127 [AHOI2009]同类分布 数位dp + 对状态剪枝

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 比较套路的题&#xff0c;首先也有个明显的状态f[pos][num][sum]f[pos][num][sum]f[pos][num][sum]表示到了pospospos位&#xff0c;当前数为numnumnum&#xff0c;各位数字之和为sumsumsu…

.NET开发框架(六)-架构设计之IIS负载均衡(视频)

前面有关注我们公众号文章的朋友应该都知道&#xff0c;我们的分布式应用服务可以通过Ocelot网关进行负载均衡&#xff0c;这种方式属于应用级别的实现。而今天我们给大家介绍的是平台级别的实现&#xff0c;并且我们首次使用视频方式进行讲解。本文通过视频方式为大家演示&…

【NOI2019】斗主地【期望】【组合数学】【下降幂】【插值】

题意&#xff1a; 有nnn张牌&#xff0c;从上往下的第iii张牌权值是f(i)itypef(i)i^{type}f(i)itype。 进行mmm次洗牌操作&#xff0c;每次操作给定aia_iai​&#xff0c;将从上往下的前aia_iai​张牌分成一堆&#xff0c;后面bib_ibi​张牌分成第二堆。如果两堆的牌数分别为…

架构杂谈《二》

服务化到微服务1、微服务的产生随着互联网企业的不断发展&#xff0c;海量用户发起的大规模、高并发请求是企业不得不面对的&#xff0c;上一篇 架构杂谈《一》杂谈的SOA服务化系统能够分解任务&#xff0c;让每个服务更简单、职责单一、更易于扩展。但无论是Web Service 还是E…

Good Bye 2017 G. New Year and Original Order 数位dp + 按数贡献

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 定义S(k)S(k)S(k)为将kkk的每一位拿出来从小到大排序后构成的数&#xff0c;比如S(3421)1234S(3421)1234S(3421)1234&#xff0c;求S(k)1≤k≤nS(k)_{1\le k\le n }S(k)1≤k≤n​。 1≤n≤107001\le n\le 10…

【NOI2019】 机器人 【区间dp】【插值】【下降幂多项式】【分段函数】

题意&#xff1a;有个长度为nnn的序列aaa&#xff0c;ai∈[Li,Ri]a_i\in [L_i,R_i]ai​∈[Li​,Ri​]。从一个位置sss可以往左直到≥as\geq a_s≥as​,往右直到>as> a_s>as​。求有多少种可能的序列满足从任意位置向左或向右的最大步数的差的绝对值不超过222。 n≤300…

上海理工大学第二届“联想杯”全国程序设计邀请赛 Identical Day 思维 + 暴力

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个010101序列&#xff0c;假设有一段长为lll连续的全111子串&#xff0c;定义这段字串不高兴值为l∗(l1)2\frac{l*(l1)}{2}2l∗(l1)​&#xff0c;整个串的所有不高兴值相加为总的不高兴值。现在你可以…

简化 Pod 故障诊断:kubectl-debug 介绍

背景容器技术的一个最佳实践是构建尽可能精简的容器镜像。但这一实践却会给排查问题带来麻烦&#xff1a;精简后的容器中普遍缺失常用的排障工具&#xff0c;部分容器里甚至没有 shell (比如 FROM scratch &#xff09;。在这种状况下&#xff0c;我们只能通过日志或者到宿主机…

dotnet 新项目格式与对应框架预定义的宏

在 sdk style 的项目格式支持使用多框架开发&#xff0c;此时需要在代码里面通过宏判断&#xff0c;在编译的时候执行不同的代码。本文告诉大家在框架里面对应的预定义的条件编译符有哪些在让一个 csproj 项目指定多个开发框架 - walterlv告诉大家如何在 sdk style 项目格式如何…

【UOJ549】序列妙妙值【异或】【根号分治】

题意&#xff1a;给一个长度为nnn的序列aaa&#xff0c;将其分成kkk段&#xff0c;不能为空&#xff0c;求所有段的异或和之和的最小值。 n≤6104,ai<216,k≤8n\leq 6\times 10^4,a_i <2^{16},k\leq 8n≤6104,ai​<216,k≤8 先求个前缀异或和&#xff0c;显然有个 dp…

Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest 思维 + 差分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你三个长度分别为k1,k2,k3k1,k2,k3k1,k2,k3的数组a,b,ca,b,ca,b,c&#xff0c;其中k1k2k3nk1k2k3nk1k2k3n&#xff0c;这三个数组中的元素拼接起来是一个nnn的排列&#xff0c;每次可以将某个数组中的某个…

TPL Dataflow .Net 数据流组件,了解一下?

作为单体程序&#xff0c;依赖的第三方服务虽不多&#xff0c;但是2C的程序还是有不少内容可讲&#xff1b;作为一个常规互联网系统&#xff0c;无外乎就是接受请求、处理请求&#xff0c;输出响应。由于业务渐渐增长&#xff0c;数据处理的过程会越来越复杂和冗长&#xff0c;…

【CF1394B】Boboniu Walks on Graph【图论】【集合哈希】

题意&#xff1a;给定nnn个点mmm张图的有向图&#xff0c;有1∼m1\sim m1∼m互不相同每个点出度不超过kkk。对于一个 kkk元组cic_ici​&#xff0c;图中的每个点uuu只保留第cdeguc_{deg_u}cdegu​​小的边。求有多少种ccc使得在保留下来的图中每个点沿着出边一直往下走可以走回…

Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 一个显然的思路就是2302^{30}230枚举所有的xxx&#xff0c;让后再检查&#xff0c;这个复杂度显然不能接受。 又发现对于每个位置它取多少不受其他位置限制&#xff0c;满足可拼接性&#…

windows container 踩坑记

windows container 踩坑记Intro我们有一些服务是 dotnet framework 的&#xff0c;不能直接跑在 docker linux container 下面&#xff0c;最近一直在折腾把它部署在 windows container 下&#xff0c;折腾的有点恶心&#xff0c;记录一下。Windows Container 介绍Windows Cont…

生成函数Euler变换学习笔记(无标号有根树计数)

众所周知&#xff0c;对于有标号计数的指数型生成函数 f(x)f(x)f(x)&#xff0c;将其任意地进行无顺序的组合&#xff0c;得到的生成函数是exp(f(x))exp(f(x))exp(f(x))。 而对于无标号计数的这样的组合&#xff0c;我们就需要引入一个叫 Eular\text{Eular}Eular 变换的东西 E…

Codeforces Round #602 (Div. 2) D2. Optimal Subsequences stl 黑科技

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 比较明显的是我们需要将序列从大到小排序&#xff0c;让后取前kkk个数&#xff0c;再从中选择第pospospos小的位置输出当前位置的数即可。 一开始想用setsetset维护&#xff0c;但是setse…