Ginger 的难题I 补题(在大佬的援助下浅谈个人理解)

文章讲述了在解决一个名为Ginger的难题I时,遇到的区间操作问题。作者最初尝试暴力求解和双指针方法,但都导致超时或错误。通过分析,作者发现应该优化算法,利用lower_bound函数找到区间并计算长度。提供的C++代码实现了这一优化策略。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文


前言

起因是前两天打校赛的模拟赛想试试水,结果暴力过16个点,双指针只能过1个点,没错就是第二个点就wa了。翻看记录发现大佬6个月前就a了,所以在大佬的帮助下,有了一点思路。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Ginger的难题I是什么?

是Ginger系列区间操作的一道题,原谅本蒟蒻a不出来

二、题目

 不放样例是因为这道题是个思维题,分析样例分析不出来什么我太懒

思路

暴力写的话1e5*1e5必超时,所以很多人可能会尝试双指针,但这是陷阱,即使样例过了也会超时,实际是第2个点wa

所以我们来优化一下,既然是区间操作,必然离不开区间的长度,我们把x出现的长度比作一条线(其中可以包含其他非x的数),我们使用lower-bound找到离l最近的有x的位置L,再找到r左边的有x的位置R,此时可以确定[L,R]一定是x开头,以x结尾,输出相应的长度即可。

上代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<int>a[N];
int main()
{
	int n;
	while(cin>>n)
	{
		for(int i=1;i<=n;i++)
		{
			int x;
			cin>>x;
			a[x].push_back(i);
		}
		int m;
		cin>>m;
		while(m--)
		{
			int l,r,x;
			cin>>l>>r>>x;
			int L=lower_bound(a[x].begin(),a[x].end(),l)-a[x].begin();
			int R=lower_bound(a[x].begin(),a[x].end(),r)-a[x].begin();
			int f=0;
			if(L!=a[x].size())
			{
				if(R==a[x].size())
				{
					f=a[x].size()-1-L+1;
				}
				else
				{
					if(a[x][R]>r)
						R--;
					f=R-L+1;
				}
			}
			if(f)
				cout<<f<<endl;
			else
				cout<<"666666!"<<endl;
		}
		cout<<endl;
	}
}

总结

第一次写,对于题目可能有理解不到位的地方,如有错误的地方欢迎大佬指正

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值