当前位置: 首页 > news >正文

Atcoder-ABC-455-D [Card Pile Query]

题目描述

N 张牌和 N 堆牌。

牌和堆的编号都是 1,2,…,N。起初,第 i 堆只包含牌 i

按顺序对每个 i=1,2,…,Q* 执行以下操作:

  • 把牌 C**i 以及叠在它上面的所有牌(顺序不变)移动到牌 P**i 的上面。保证在执行操作前,牌 C**i 和牌 P**i 在不同的堆里,且牌 P**i 是某堆的最顶端。

操作全部完成后,求每堆牌的牌数。

约束条件

  • 1≤N,Q≤3×105
  • 1≤C**i,P**iN
  • 操作按顺序执行时,每次操作前,牌 Ci* 和牌 *Pi* 必定在不同堆。
  • 操作按顺序执行时,每次操作前,牌 P**i 必定是某堆的顶牌。
  • 所有输入均为整数。

输入格式

标准输入格式如下:

N Q
C1 P1
C2 P2
⋮⋮
CQ PQ

输出格式

A**i 为最终第 ii 堆的牌数,按顺序输出 A1,A2,…,A**N*,用空格分隔。

样例 1

Input复制 Output复制
5 4 1 3 4 5 1 4 4 2 0 3 1 0 1

操作过程如图所示。

img

样例 2

Input复制 Output复制
7 8 3 1 5 4 2 5 5 7 2 3 6 2 3 4 5 1 2 0 0 4 0 0 1

算法分析

用双向链表解决,用pre和nxt两个数组分别存编号为i的牌的上面一个元素和下面一个元素,对于每次输入的C和P,断绝C和它下面的牌的连接,把C和P连接起来,就处理完毕了,输出时用一个f数组存储,遍历每张牌的上面和下面即可。

接下来展示一个TLE代码

#include<bits/stdc++.h>
using namespace std;
int n,q;
int f[300005];
int pre[300005];//第i张牌的下面的编号
int nxt[300005];//第i张牌的上面的编号
int main(){cin>>n>>q;for(int i = 1; i<=n; i++){pre[i] = 0;nxt[i] = 0;}for(int i = 1; i<=q; i++){int x,y;cin>>x>>y;nxt[pre[x]] = 0;pre[x] = y;nxt[y] = x;}for(int i = 1; i<=n; i++){int cnt = -1;int t = i;while(t!=0){cnt++;t = nxt[t];}t = i;int last = t;while(t!=0){cnt++;last = t;t = pre[t];}f[last] = cnt;}for(int i = 1; i<=n; i++){cout<<f[i]<<" ";}return 0;
}

为什么会超时呢?因为此时的时间复杂度时O(NQ)的,有一些牌其实已经被同一堆的牌遍历过一遍了,再遍历就没有必要了。

解决方案:用vis数组标记该点是否已被访问,被访问就跳过。

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,q;
int f[300005];
bool vis[300005];
int pre[300005];//第i张牌的下面的编号
int nxt[300005];//第i张牌的上面的编号
int main(){cin>>n>>q;for(int i = 1; i<=n; i++){pre[i] = 0;nxt[i] = 0;}for(int i = 1; i<=q; i++){int x,y;cin>>x>>y;nxt[pre[x]] = 0;pre[x] = y;nxt[y] = x;}for(int i = 1; i<=n; i++){if(vis[i]==1){continue;}int cnt = -1;int t = i;while(t!=0){cnt++;vis[t] = 1;t = nxt[t];}t = i;int last = t;while(t!=0){cnt++;vis[t] = 1;last = t;t = pre[t];}f[last] = cnt;}for(int i = 1; i<=n; i++){cout<<f[i]<<" ";}return 0;
}
http://www.jsqmd.com/news/728216/

相关文章:

  • 从Python到CAPL:数据转换的思维切换与函数对照手册(Vector CANoe环境)
  • ComfyUI-Manager完整指南:三步掌握节点管理终极技巧
  • python3 安装
  • Android 10 AudioService音频路由实战:手把手教你实现通话时扬声器/听筒的智能切换
  • 从电源到驱动:手把手教你用STM32F407和TPS54360搭建伺服电机控制板(附PCB设计要点)
  • 为什么你的Dify集成总在测试环境崩?揭秘3类隐蔽性OAuth2.1令牌劫持场景及防御型配置模板(含YAML速查表)
  • 保姆级教程:用STC8H的PWMB模块捕获霍尔编码器信号(附完整代码)
  • 观察Taotoken在流量高峰期的API延迟与稳定性表现
  • 告别公式!用C语言查表法搞定NTC测温,附MF52E 10K完整代码与对分查找优化
  • 2026办公室咖啡机推荐:打造高效办公咖啡时光 - 品牌排行榜
  • 【DeepSeek】GRUB介绍
  • 抖音内容下载全攻略:从技术原理到价值延伸的完整解决方案
  • K-Means实战:用Java给你的用户分个群,从数据准备到结果可视化全流程
  • 长期使用 Taotoken 服务后对其模型广场选型便利性的感受
  • 独立开发呼吸训练 iOS App:Swift 帧率自适应动画方案分享与踩坑记录
  • UE5蓝图Cast节点保姆级避坑指南:从接口转换到组件获取的实战技巧
  • 别再只会用shutdown了!Windows计划任务schtasks保姆级教程,定时关机、备份、清理一键搞定
  • Go语言机器人框架golembot:模块化设计与事件驱动架构实践
  • iPhone+UE5.2:用Live Link Face App零成本搞定你的第一个MetaHuman表情动画
  • 轻松掌握Steam成就管理:从入门到精通的全方位指南
  • 从会调模型到能干活的AI:收藏这份智能体开发工程师成长指南
  • M24C64芯片资料与程序代码(1)
  • 035、为Agent构建Web界面:打造交互式前端应用
  • NoFences:让Windows桌面告别混乱,重获清爽工作空间
  • 网盘直链下载助手终极教程:八大网盘免费获取真实下载链接
  • 终极指南:3分钟掌握QQ音乐加密文件转换,让音乐自由播放
  • Windows注册表备份与迁移全攻略:巧用reg export/import告别重装系统的烦恼
  • win系统安装Python3.11
  • TV Bro电视浏览器:开源免费的智能电视上网终极指南
  • 5分钟快速搞定APA 7th引用格式:Word样式表终极安装指南