牛客多校2021-1-Journey among Railway Stations

本文解析了一道关于铁路站点间旅行的问题,涉及N个站点和合法时间段的约束。通过预处理和线段树的数据结构优化,实现了路径的快速查询与更新。适用于大规模数据集,N和Q不超过100万。

题目链接:Journey among Railway Stations

题目大意: 一段路上有 N N N个点,每个点有一个合法时间段 [ u i , v i ] [u_i, v_i] [ui,vi],相邻两个点有一个长度。每次问,在 u i u_i ui 的时间从 i i i 出发后,能否依次经过 i + 1   j i+1~j i+1 j 的所有点,使得到达时间满足每个点的合法区间(如果提前到可以等待,迟到了失败了)。同时还可能修改一段路的长度,或者修改一个点的合法时间段。 N , Q ≤ 1000000 N, Q \leq 1000000 N,Q1000000

题目分析: 考虑区间 [ l , r ] [l,r] [l,r] 的限制条件,以区间 [ 1 , 3 ] [1,3] [1,3]为例,即 u 1 ≤ v 1 , m a x ( u 1 + d 1 , u 2 ) ≤ v 2 , m a x ( m a x ( u 1 + d 1 , u 2 ) + d 2 , u 3 ) ≤ v 3 u_1\leq v_1,max(u_1+d_1,u_2) \leq v_2,max(max(u_1+d_1,u_2)+d_2,u_3)\leq v_3 u1v1,max(u1+d1,u2)v2,max(max(u1+d1,u2)+d2,u3)v3我们设 u i ′ = u i + d i + d i + 1 + . . . + d n − 1 , v i ′ = v i + d i + d i + 1 + . . . + d n − 1 u_i'=u_i+d_i+d_{i+1}+...+d_{n-1},v_i'=v_i+d_i+d_{i+1}+...+d_{n-1} ui=ui+di+di+1+...+dn1,vi=vi+di+di+1+...+dn1,那么区间 [ 1 , 3 ] [1,3] [1,3]的限制条件就变为了 u 1 ′ ≤ v 1 ′ , m a x ( u 1 ′ , u 2 ′ ) ≤ v 2 ′ , m a x ( u 1 ′ , u 2 ′ , u 3 ′ ) ≤ v 3 ′ u_1'\leq v_1',max(u_1',u_2')\leq v_2',max(u_1',u_2',u_3')\leq v_3' u1v1,max(u1,u2)v2,max(u1,u2,u3)v3线段树维护当前区间是否可行,以及当前区间中 u u u的最大值和 v v v的最小值,在区间合并时该区间是可行区间的充分条件是他的两个子区间都是可行区间并且左区间中 u u u的最大值应当小于等于右区间中 v v v的最小值。代码如下。

题目代码:

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
#define LL long long
#define mxn 1000005
struct Tree{
	LL u_maxn,v_minn,lazy;
	bool ok;
}tree[mxn<<2];
LL U[mxn],V[mxn],d[mxn],_u[mxn],_v[mxn],sum[mxn],ns[mxn];
void pushup(LL loc){
	tree[loc].u_maxn=max(tree[loc<<1|1].u_maxn,tree[loc<<1].u_maxn);
	tree[loc].v_minn=min(tree[loc<<1|1].v_minn,tree[loc<<1].v_minn);
	tree[loc].ok=tree[loc<<1].ok&tree[loc<<1|1].ok;
	tree[loc].ok&=(tree[loc<<1].u_maxn<=tree[loc<<1|1].v_minn);
}
void pushdown(LL loc,LL v){
	tree[loc<<1].u_maxn-=v;
	tree[loc<<1|1].u_maxn-=v;
	tree[loc<<1].v_minn-=v;
	tree[loc<<1|1].v_minn-=v;
	tree[loc<<1].lazy+=v;
	tree[loc<<1|1].lazy+=v;
	tree[loc].lazy=0;
}
void Build(LL loc,LL L,LL R){
	tree[loc].lazy=0;
	if(L==R){
		tree[loc].ok=(_u[L]<=_v[L]);
		tree[loc].u_maxn=_u[L];
		tree[loc].v_minn=_v[L];
		return;
	}
	LL mid=(L+R)>>1;
	Build(loc<<1,L,mid);
	Build(loc<<1|1,mid+1,R);
	pushup(loc);
}
void Update_d(LL loc,LL L,LL R,LL l,LL r,LL v){
	if(l<=L&&r>=R){
		tree[loc].u_maxn-=v;
		tree[loc].v_minn-=v;
		//tree[loc].ok&=(tree[loc].u_maxn<=tree[loc].v_minn);
		tree[loc].lazy+=v;
		return;
	}
	LL mid=(L+R)>>1;
	if(tree[loc].lazy)pushdown(loc,tree[loc].lazy);
	if(r<=mid)Update_d(loc<<1,L,mid,l,r,v);
	else if(l>mid)Update_d(loc<<1|1,mid+1,R,l,r,v);
	else Update_d(loc<<1,L,mid,l,mid,v),Update_d(loc<<1|1,mid+1,R,mid+1,r,v);
	pushup(loc);
}
void Update_uv(LL loc,LL L,LL R,LL pos,LL u,LL v){
	if(L==R){
		tree[loc].u_maxn-=u;
		tree[loc].v_minn-=v;
		tree[loc].ok&=(tree[loc].u_maxn<=tree[loc].v_minn);
		return;
	}
	LL mid=(L+R)>>1;
	if(tree[loc].lazy)pushdown(loc,tree[loc].lazy);
	if(pos<=mid)Update_uv(loc<<1,L,mid,pos,u,v);
	else Update_uv(loc<<1|1,mid+1,R,pos,u,v);
	pushup(loc);
}
Tree Query(LL loc,LL L,LL R,LL l,LL r){
	if(l<=L&&r>=R)return tree[loc];
	LL mid=(L+R)>>1;
	if(tree[loc].lazy)pushdown(loc,tree[loc].lazy);
	if(r<=mid)return Query(loc<<1,L,mid,l,r);
	else if(l>mid)return Query(loc<<1|1,mid+1,R,l,r);
	else{
		Tree ns=Query(loc<<1,L,mid,l,mid),np=Query(loc<<1|1,mid+1,R,mid+1,r);
		Tree ret=(Tree){max(ns.u_maxn,np.u_maxn),min(ns.v_minn,np.v_minn),0,0};
		ret.ok=ns.ok&np.ok;
		ret.ok&=(ns.u_maxn<=np.v_minn);
		return ret;
	}
}
void Print(LL loc,LL L,LL R){
	if(L==R){
		printf("%d %d\n",tree[loc].u_maxn,tree[loc].v_minn);
		return;
	}
	LL mid=(L+R)>>1;
	if(tree[loc].lazy)pushdown(loc,tree[loc].lazy);
	Print(loc<<1,L,mid);
	Print(loc<<1|1,mid+1,R);
}
int main()
{
	
	LL t,n,m;
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		for(LL i=1;i<=n;i++)
			sum[i]=ns[i]=0; 
		for(LL i=1;i<=n;i++)
			scanf("%lld",&U[i]);
		for(LL i=1;i<=n;i++)
			scanf("%lld",&V[i]);
		for(LL i=1;i<=n-1;i++)
			scanf("%lld",&d[i]);
		for(LL i=n-1;i;i--)
			sum[i]=sum[i+1]+d[i];
		for(LL i=1;i<=n;i++){
			_u[i]=U[i]+sum[i];
			_v[i]=V[i]+sum[i];
		}
		LL maxn=0;
		for(LL i=1;i<=n;i++){
			maxn=max(_u[i],maxn);
			if(_v[i]>=maxn)ns[i]=1;
		}
		Build(1,1,n);
		scanf("%lld",&m);
		while(m--){
			//Print(1,1,n);
			printf("%d\n",Query(1,1,n,1,3).ok);
			LL opt,k,u,v;
			scanf("%lld",&opt);
			if(opt==0){
				scanf("%lld %lld",&u,&v);
				if(Query(1,1,n,u,v).ok)printf("Yes\n");
				else printf("No\n");
			}
			if(opt==1){
				scanf("%lld %lld",&k,&v);
				Update_d(1,1,n,1,k,d[k]-v);
				d[k]=v;
			}
			if(opt==2){
				scanf("%lld %lld %lld",&k,&u,&v);
				Update_uv(1,1,n,k,U[k]-u,V[k]-v);
				U[k]=u;V[k]=v;
			}
		}
	}
	return 0;
}
/*
5
1 2 3 4 5
3 4 5 6 7
1 1 1 1
5
0 1 5
1 1 3
0 1 5
2 2 2 3
0 1 5
*/
【完美复现】面向配电网韧性提升的移动储能预布局与动态调度策略【IEEE33节点】(Matlab代码实现)内容概要:本文介绍了基于IEEE33节点的配电网韧性提升方法,重点研究了移动储能系统的预布局与动态调度策略。通过Matlab代码实现,提出了一种结合预配置和动态调度的两阶段优化模型,旨在应对电网故障或极端事件时快速恢复供电能力。文中采用了种智能优化算法(如PSO、MPSO、TACPSO、SOA、GA等)进行对比分析,验证所提策略的有效性和优越性。研究不仅关注移动储能单元的初始部署位置,还深入探讨其在故障发生后的动态路径规划与电力支援过程,从而全面提升配电网的韧性水平。; 适合人群:具备电力系统基础知识和Matlab编程能力的研究生、科研人员及从事智能电网、能源系统优化等相关领域的工程技术人员。; 使用场景及目标:①用于科研复现,特别是IEEE顶刊或SCI一区论文中关于配电网韧性、应急电源调度的研究;②支撑电力系统在灾害或故障条件下的恢复力优化设计,提升实际电网应对突发事件的能力;③为移动储能系统在智能配电网中的应用提供理论依据和技术支持。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析,重点关注目标函数建模、约束条件设置以及智能算法的实现细节。同时推荐参考文中提及的MPS预配置与动态调度上下两部分,系统掌握完整的技术路线,并可通过替换不同算法或测试系统进一步拓展研究。
### 关于京东牛客网技术运维工程师笔试题目与经验 #### 笔试内容概述 技术运维工程师的笔试通常会涉及计算机基础、网络协议、操作系统原理以及实际问题解决能力等方面的知识。根据以往的经验,京东的技术运维工程师笔试可能包括但不限于以下几个方面[^1]: - **基础知识**:数据结构与算法的基础应用,例如数组、链表的操作,排序算法的选择与实现。 - **网络知识**:TCP/IP 协议栈的理解,HTTP/HTTPS 的工作流程,DNS 解析过程等。 - **Linux 操作系统**:Shell 编程、进程管理、文件权限控制等内容。 - **数据库操作**:SQL 查询语句优化,索引设计,事务处理机制。 以下是几个常见的考察方向及其对应的示例问题: #### 数据结构与算法实例 ```python def find_missing_number(nums): n = len(nums) + 1 expected_sum = n * (n + 1) // 2 actual_sum = sum(nums) return expected_sum - actual_sum ``` 此函数用于在一个长度为 `n` 的列表中找到缺失的一个整数,假设该列表原本应包含从 1 到 `n` 的连续正整数序列[^1]。 #### Linux Shell 实现脚本 编写一个简单的 Bash 脚本来监控磁盘空间并发送警告邮件给管理员: ```bash #!/bin/bash THRESHOLD=90 CURRENT=$(df / | grep / | awk '{ print $5}' | sed 's/%//g') if [ "$CURRENT" -gt "$THRESHOLD" ]; then echo "Warning: Disk space is low." | mail -s "Disk Space Alert" admin@example.com fi ``` 这段代码展示了如何通过命令行工具检测根目录下的可用存储容量,并在超过设定阈值时触发警报通知[^3]。 #### SQL 查询技巧 对于大规模关系型数据库中的性能调优而言,合理创建复合索引可以显著提升查询效率。比如,在一张记录用户活动日志的大表里查找特定时间段内的活跃用户数量时,应该考虑对日期字段建立覆盖索引来减少全表扫描带来的开销。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值