首页 > 其他分享 >[ABC389C] Snake Queue题解

[ABC389C] Snake Queue题解

时间:2025-01-18 23:21:44浏览次数:1  
标签:int 题解 ABC389C 偏移量 Queue 队列 坐标 头部 dq

前情

题意:

问题陈述

有一个(蛇)队列。最初,队列是空的。

你会得到 \(Q\) 个查询,这些查询应按给出的顺序处理。查询有三种类型:

  • 类型 \(1\) :以 1 l 的形式给出。一条长度为 \(l\) 的蛇会被添加到队列的末尾。如果添加前队列为空,则新添加的蛇的头部位置为 \(0\) ;否则,它就是队列中最后一条蛇的头部坐标与最后一条蛇的长度之和。
  • 类型 \(2\) :以 "2 "的形式给出。队列最前面的蛇离开队列。保证此时队列不是空的。假设 \(m\) 是离开队列的蛇的长度,那么队列中剩余的每条蛇的头部坐标都会减少 \(m\) 。
  • 类型 \(3\) :以 3 k 的形式给出。输出距离队列前列 \(k\) 的蛇头坐标。保证此时队列中至少有 \(k\) 条蛇。

思路

类型 \(1\) 和类型 \(2\) 做起来都很简单,因为是头部删除尾部入队,首选 deque 来处理,时间复杂度均为 \(O(1)\) ,但如果类型 \(3\) 用循环一遍进行减去更新的话最坏时间复杂度为 \(O(N)\) ,整体时间复杂度为 \(O(N^2)\) ,在 \(1 \leq Q \leq 3 \times 10^{5}\) 的情况下,通过是不现实的。

优化

可以设置一个偏移量进行记录全体蛇的位移情况,每当删除头蛇时,偏移量就加上头蛇的长度,到查询时直接用第 \(k\) 条蛇的蛇头坐标减去偏移量即可,这样使时间复杂度优化到 \(O(N)\) 。

注意事项

需要注意的是,偏移量只有在删除蛇时才会改变,因为删除蛇会影响剩余蛇的相对头部坐标,而新添加的蛇是基于队列末尾的蛇来计算头部坐标的。还有记得开long long,被这里卡了。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std;
		
struct Snake{
	int hd,len;
};
deque <Snake> dq;
signed main(){
	int Q;
	cin>>Q;
	int mov=0;//偏移量记录移动
	while(Q--){
		int q;
		cin>>q;
		if(q==1){//插入操作
			int l;
			cin>>l;
			int nh=0;
			if(!dq.empty()){
				nh=dq.back().hd+dq.back().len;//计算头部坐标
			}
			dq.push_back({nh,l});
		}
		if(q==2){//删除
			int er=dq.front().len;
			dq.pop_front();
			mov+=er;//增加偏移量
		}
		if(q==3){
			int k;
			cin>>k;
			cout<<dq[k-1].hd-mov<<endl;//查询
		}
	}
	return 0;
}

完美结束..

标签:int,题解,ABC389C,偏移量,Queue,队列,坐标,头部,dq
From: https://www.cnblogs.com/TobyL/p/18679018

相关文章

  • Atcoder ABC389E Square Price 题解 [ 绿 ] [ 二分 ] [ 贪心 ]
    SquarePrice:垃圾卡精度,垃圾卡精度,垃圾卡精度,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人,傻逼出题人。把ll改__int128前WA*22,改__int128直接AC了,难评。抛开卡精度这题还是挺好的。暴力先考虑暴力思路,显然暴力应该这么打:把所有物品全丢进优先队列......
  • 【鱼皮大佬API开放平台项目】Spring Cloud Gateway HTTPS 配置问题解决方案总结
    问题背景项目架构为前后端分离的微服务架构:前端部署在8000端口API网关部署在9000端口后端服务包括:api-backend(9001端口)api-interface(9002端口)初始状态:前端已配置HTTPS(端口8000)后端服务未配置HTTPS通过Nginx进行反向代理遇到的问题第一阶段:400Ba......
  • uniapp获取元素高度不准确问题解决
    uniapp通过boundingClientRect获取的元素高度和实际高度差了不少,下面是复现和解决过程:我的代码: 得到的结果: 高度只有105用工具量一下: 实际有240px,遂gpt问下: 注意到了缩放比这个之前没想到的点,往下面看gpt更多的回复内容: 先获取系统缩放比,再乘以拿到的......
  • [BZOJ3451] Normal 题解
    这题分三步:葺网(期望)、淀粉质(点分治)、蓉翅(容斥),再佐以芬芳团(FFT),一道巨难无比的luogu黑题就诞生了。期望先考虑在淀粉树上,\(i\)点在\(j\)点的子树里的概率。实际上这个问题的每种情况相当于是\(n\)个点的各种排列方式。这也就相当于,我们在选择\(j\)点之前,没有选择路径\((......
  • PKUWC 2025 题解
    本人太菜,实在不会T3,所以只有T1,T2的题解。注:考场上只做出来了Day1T1,其他题参考了其他人的题解。Day1T1题面有\(a\)个有电的电池和\(b\)个没电的电池,每次只能选择两个电池放进手电筒,只有这两个电池全有电才能让手电筒启动。问最坏情况下最少可以让手电筒启动的尝试次......
  • THUWC2025题解
    Day1T1构造一个排列,使满足最多的形如\([l,r]\)内单调递增/减。一个简单的线段树优化DP,设状态\(f_{i,0/1}\)即可转移,\(O(n\logn)\)。T2支持往集合中加三维带权点,查询集合中没有任何一维与给出点对应维度相等的最大点权。唐题。一种暴力的想法是三维数点之类的,不太能......
  • PKUWC2025部分题解
    Day1A注意到,原题等价于构造一个\(a+b\)个点的完全图,使最大独立集\(<a\),且边数最小。很难发现,图必然被划分成\(a-1\)个完全图。据此DP或令\(a-1\)个图点数平均。CDAG上考虑暴力。设\(f_{u,i}\)表示第\(i\)轮在\(u\)是否先手必胜。转移枚举相邻点就好,\(\large......
  • [ZJOI2014] 力 题解
    容易发现:\[E_i=\sum_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^n\frac{q_j}{(i-j)^2}\]不妨设\(a_i=q_i,b_i=\dfrac1{i^2}\):\[E_i=\sum_{j=1}^{i-1}a_jb_{i-j}-\sum_{j=1}^{n-i}a_jb_{j-i}\]发现前半部分就是多项式乘法,后半部分与[BZOJ2194]一致。直接FFT干过去即可......
  • 线性dp+背包问题题解
    线性dp理解递推/记忆化搜索,有很多种理解方式递归重叠子问题的记忆化搜索:像这里例如\(f[3]\)可以通过一次计算得到,保存答案,下一次直接调用即可,省去很多复杂度我们从此引出dp第一个性质:最优子结构大问题的最优解包含小问题的最优解,并且小问题的最优解可以推导出大问题的最优......
  • P1076 [NOIP2012 普及组] 寻宝 题解
    题目传送锚点在博客园食用更佳本题纯纯模拟题,甚至连大模拟都算不上。别问我是怎么知道的,问就是看那恶心的题目描述、标签和题目难度仅为黄知道的。好了,上思路。既然是大模拟,那就按照题目描述给的思路来,一层一层往上爬呗。一下是两点注意事项:输入时,可以考虑用二维数组或结构......