UR #13 Yist
2024-10-18 04:55:02
第一次打UR,打了一个半小时就弃疗了QAQ
这是我唯一一道考试的时候做出来的题目,其他两道连暴力都懒得写了
很容易发现对于每个要删除的点
我们找到左边第一个比他小的不用删除的点,右边第一个比他小的不用删除的点
中间这段区间就是对于这个点被删除时的极大区间
对于所有的区间我们取min就可以了
对于找到某个点左边第一个比他小的不用删除的点
我是这样考虑的:将数从大到小的进行添加,并用并查集维护不用删除的点
那么之后这个点存在的极大区间显然是这段区间里的1的个数+1
这个算法是O(na)的
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std; const int maxn=1000010;
int n,T,ans;
int a[maxn],pos[maxn];
char b[maxn];
int L[maxn],R[maxn];
int sum[maxn];
int ufsL(int x){return L[x]==x?x:L[x]=ufsL(L[x]);}
int ufsR(int x){return R[x]==x?x:R[x]=ufsR(R[x]);}
void read(int &num){
num=0;char ch=getchar();
while(ch<'!')ch=getchar();
while(ch>='0'&&ch<='9')num=num*10+ch-'0',ch=getchar();
}
void Solve(){
for(int i=1;i<=n;++i){
if(b[i]=='1')sum[i]=sum[i-1]+1;
else sum[i]=sum[i-1];
}
ans=n;L[0]=0;
for(int i=1;i<=n;++i){
if(b[i]=='1')L[i]=i;
else L[i]=ufsL(i-1);
}R[n+1]=n+1;
for(int i=n;i>=1;--i){
if(b[i]=='1')R[i]=i;
else R[i]=ufsR(i+1);
}
for(int i=n;i>=1;--i){
int p=pos[i];
if(b[p]=='1'){
L[p]=ufsL(p-1);
R[p]=ufsR(p+1);
}else{
int A=ufsL(p);
int B=ufsR(p);
ans=min(ans,sum[B-1]-sum[A]+1);
}
}return;
}
int main(){
read(n);
for(int i=1;i<=n;++i)read(a[i]),pos[a[i]]=i;
scanf("%d",&T);
while(T--){
scanf("%s",b+1);
Solve();
printf("%d\n",ans);
}return 0;
}
题解给出了一种O(n)的做法,还是回顾刚才的思路
我们注意到我们的并查集只有删除操作
也就是说如果一个点扩展的时候访问到之前已经扩展过的点
这个点的区间长度一定比之前扩展的那个点的区间长度要长
由于我们取的是min,所以我们就不用扩展了
这样我们就可以保证每个元素只访问一次,每次暴力扩展即可
时间复杂度显然是O(n)的
最新文章
- GridView
- session 的用法
- linux中脚本的一些小知识的积累
- 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C
- oc-03-OC访问OC源文件、C源文件中的函数
- MyBatis对不同数据库的主键生成策略
- [HDU 1695] GCD
- spring quartz的触发器CrontriggerBean配置
- Fireworks Extension —— 开发篇(Dom模型)
- RTP 协议
- 关于Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
- NYOJ 25 A Famous Music Composer
- mysql常用命令行操作(二):表和库的操作、引擎、聚合函数
- Python 线程同步锁, 信号量
- jdk8系列三、jdk8之stream原理及流创建、排序、转换等处理
- JAVA基础知识总结:二十
- AJPFX:外汇的杠杆保证金是什么
- 确保线程安全下使用Queue的Enqueue和Dequeue
- MutationObserver DOM变化的观察
- VS2013创建Node.js C++ Addons的过程
热门文章
- 正文字体大小:大 中 小 解决configure: error: Cannot find libmysqlclient under /usr
- mysql 不能远程连接
- Call与Apply
- Ubuntu Android Studio/IntelliJ IDEA 支持文件中文命名
- iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)
- mysql中使用update select
- Using jQuery to add a dynamic “Back To Top” floating button with smooth scroll
- Python遍历文件夹枚举所有文件类型
- insert into (select...WITH CHECK OPTION) values(...)
- Linux下Mysql数据库备份