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

CF2030D QEDs Favorite Permutation 解题报告

题目传送门

题目描述

给定一个长度为 \(n\) 的排列 \(p\)(包含从 \(1\)\(n\) 的所有数字),对应一串只由 LR 组成的字符串,L 表示这个数可以和左边相邻的数字交换,R 表示这个数可以和右边相邻的数交换。\(q\) 次询问每次改掉字符串中的一个字符(L 改为 RR 改为 L),且每次修改后保留,问每次修改后是否能通过字符串中的 LR 操作将此排列非降序排序。

解题思路

通过题意,我们会发现,一个数字 \(p_i\) 可以向右交换,当且仅当 \(s_i=\)R 或者 \(s_{i+1}=\)L。换句话说,对于一个 \(i(1\le i\le n)\)只要 \(s_i=\)L 并且 \(s_{i+1}=\)R\(p_i\) 及其左边的数就永远交换不到右边,\(p_{i+1}\) 及其右边的数也永远交换不到左边,我们暂称 \(i\)\(i+1\) 这条“无法逾越的线”叫做分界线。那么只要在这条分界线左边(从 \(p_1\)\(p_i\))没有涵盖从 \(1\)\(i\) 所有的数,那么它所缺少的数在分界线右边,永远不会交换到 \(1\)\(i\) 内,此时序列永远不会非降序排序。只要序列中存在这样的分界线,答案一定是 NO,我们称这种分界线为对答案有贡献的分界线

所以我们只需要维护这种对答案有贡献的分界线的个数 cnt,cnt 非零就输出 NO,否则就是 YES。这样一来,预处理是必不可少的,定义 bool 类型 check 数组,其中 \(check_i\) 表示从 \(p_1\)\(p_i\) 是否涵盖了从 \(1\)\(i\) 的所有数字,并定义一个 set 来存储所有的分界线的左下标。

对于每次修改 \(s_i\),如果 \(i\) 或者 \(i-1\) 为分界线的下标,说明这次修改把分界线破坏掉了,将其在 set 中删除,再根据分界线的下标确定是否将对答案有贡献的分界线破坏掉了,如果是,更新 cnt。修改完后,判断此时 \(s_i\) 与其左边或者右边是否又组成了新的分界线,将分界线存入 set 中,并判断根据分界线左下标的 check 判断此分界线是否为对答案有贡献的分界线,更新 cnt。然后根据当前 cnt 值输出就可以了。

AC Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<set>
#define N 200005
using namespace std;
int T,n,q;
int a[N];//序列p
char s[N];
bool check[N];
set<int>st;
int re()//防止作弊不放快读快写
void wr(int x)
signed main()
{T=re();while(T--){int maxx=0,cnt=0;//maxx代表当前所输进来的最大值n=re(),q=re();for(int i=1;i<=n;i++)a[i]=re(),maxx=max(maxx,a[i]),check[i]=(maxx==i);//如果maxx不是i,说明当前p1~pi中有比i大的数,则p1~pi肯定不会涵盖1~i的所有元素cin>>s;for(int i=n;i;i--)s[i]=s[i-1];s[0]=0;//手动将字符串改为下标为1~n的for(int i=1;i<n;i++)if(s[i]=='L'&&s[i+1]=='R')//分界线{st.insert(i);if(!check[i])//对答案有贡献的分界线cnt++;}while(q--){int k=re();s[k]=s[k]=='L'?'R':'L';//修改操作if(st.find(k)!=st.end())//k是一条分界线左下标{st.erase(k);if(!check[k])cnt--;}if(st.find(k-1)!=st.end()){st.erase(k-1);if(!check[k-1])cnt--;}if(s[k]=='L'&&s[k+1]=='R'){st.insert(k);if(!check[k])cnt++;}if(s[k]=='R'&&s[k-1]=='L'){st.insert(k-1);if(!check[k-1])cnt++;}//更新cntputs(cnt?"NO":"YES");}st.clear();//多测清空}return 0;
}
http://www.gsyq.cn/news/98715.html

相关文章:

  • P9573 「TAOI-2」核心共振 解题报告
  • Transformer彻底剖析(11):多层感知机MLP
  • P9345 夕阳西下几时回 解题报告
  • 本地部署开源可视化界面开发工具 Node-RED 并实现外部访问( Linux 版本)
  • 本地部署开源可视化界面开发工具 Node-RED 并实现外部访问( Windows 版本)
  • 实习面试题-ZooKeeper 原理面试题
  • U249090 密码门 私题题解
  • 【Vue3】 中 ref 与 reactive:状态与模型的深入理解
  • 双机并联虚拟同步发电机仿真模型:均分负载与优质波形输出,可拓展自适应与光伏储能技术
  • Grep 例程大全
  • 网页前端如何通过JSP实现大文件秒传功能?
  • Ursa.Avalonia样式系统终极指南:5大技巧助你构建企业级UI
  • Asio应用(高级):构建高性能、安全、跨平台的网络系统
  • 实习面试题-Spark SQL 面试题
  • CF1619G Unusual Minesweeper 解题报告
  • 基于vue的个人博客论坛交流网站_sdj10346_springboot php python nodejs
  • 如何使用yolov11训练使用—番茄炭疽病与品质检测数据集 炭疽病症状识别、病害区域检测、成熟果实与腐烂果实区分 目标检测 4类 可直接用于模型训练 YOLO适用的txt格式
  • 四旋翼无人机PID控制仿真模型探索
  • JAVA中如何利用JSP实现视频文件的分片上传?
  • 列出自己网站音频书籍资源方法附php代码
  • 隐式转换,强制转换,字符串,字符的加操作
  • .NET进阶——深入理解Lambda表达式(2)手搓LINQ语句
  • Android中Compose系列之按钮Button
  • wangEditor支持pdf书签目录结构导入功能
  • Agent 结构(LLM + Tool + Executor)
  • 红米10x将一键清理和锁屏加到桌面步骤
  • 台达DVPEH3系列PLC与欧姆龙E5CC温控器通讯及控制实现
  • 192KHz 双声道输入 24 位 AD 转换器国产品牌DP8340兼容CS5340
  • Cameralink采集卡软件EspeedGrab使用讲解:3 保存采集参数
  • XPM与IP模式下FIFO的比较