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

AtCoder Beginner Contest 381 E - 11/22 Subsequence

E - 11/22 Subsequenceicon-default.png?t=O83Ahttps://atcoder.jp/contests/abc381/tasks/abc381_e

思路:

我们可以先求一遍前缀和

分别表示1的数量和2的数量

再记录每个/出现的位置

对于每一次询问 我们用二分找出被lr夹住的左右/

再用三分去找出答案就可以了

代码:

#include<bits/stdc++.h>
using namespace std;
#define N 200100
int n,q;
string s;
int a[N],b[N];
int l,r,mid1,mid2;
int idx,v[N],ll,rr,m,ans;
int main()
{
	cin>>n>>q>>s;
	s=' '+s;
	for(int i=1;i<=n;i++)
	{
		if(s[i]=='1')a[i]++;
		else if(s[i]=='2')b[i]++;
		else
		{
			idx++;
			v[idx]=i;
		}
		a[i]+=a[i-1];
		b[i]+=b[i-1];
	}
	while(q--)
	{
		cin>>ll>>rr;
		ans=0;
		l=lower_bound(v+1,v+idx+1,ll)-v;
		r=upper_bound(v+1,v+idx+1,rr)-v-1;
		if(l>r)
		{
			cout<<0<<endl;
			continue;
		}
		int p=1000;
		while(l<=r&&p--)
		{
			mid1=l+(r-l)/3;
			mid2=r-(r-l)/3;
			if(a[v[mid1]]-a[ll-1]<b[rr]-b[v[mid1]-1])
			{
				l=max(mid1-1,l+1);
			}
			else
			{
				r=min(mid2+1,r-1);
			}
			m=v[mid1];
			ans=max(ans,2*min(a[m]-a[ll-1],b[rr]-b[m-1])+1);
			m=v[mid2];
			ans=max(ans,2*min(a[m]-a[ll-1],b[rr]-b[m-1])+1);
		}
		cout<<ans<<endl;
	}
	return 0;
}


http://www.kler.cn/a/406771.html

相关文章:

  • js高级06-ajax封装和跨域
  • 【Python系列】 Base64 编码:使用`base64`模块
  • 大数据基于Spring Boot的化妆品推荐系统的设计与实现
  • 23种设计模式-模板方法(Template Method)设计模式
  • C#(11) 运算符重载
  • SpringBoot多环境+docker集成企业微信会话存档sdk
  • Golang基础
  • 使用命令行创建 Maven 项目
  • 文件的摘要算法(md5、sm3、sha256、crc)
  • 【LeetCode热题100】队列+宽搜
  • 企业OA管理系统:Spring Boot技术实践与案例分析
  • 了解大模型:开启智能科技的新篇章
  • ubuntu增加swap交换空间
  • SpringMVC应用专栏介绍
  • 全面解析 JMeter 前置处理器:概念、工作原理与应用场景
  • 归并排序:数据排序的高效之道
  • 【大数据学习 | Spark-Core】RDD的概念与Spark任务的执行流程
  • 自动驾驶概念
  • Java将PDF保存为图片
  • 【H2O2|全栈】JS进阶知识(八)ES6(4)
  • socket连接封装
  • 昆明理工大学《2023年+2021年816自动控制原理真题》 (完整版)
  • Kubernetes:容器编排的强力
  • SpringBoot中使用Sharding-JDBC实战(实战+版本兼容+Bug解决)
  • 个人笔记本安装CUDA并配合Pytorch使用NVIDIA GPU训练神经网络的计算以及CPUvsGPU计算时间的测试代码
  • Android adb shell dumpsys audio 信息查看分析详解