线段树爆蛋求助
  • 板块P2412 查单词
  • 楼主mot1ve
  • 当前回复5
  • 已保存回复5
  • 发布时间2021/10/31 15:49
  • 上次更新2023/11/4 01:43:22
查看原帖
线段树爆蛋求助
250699
mot1ve楼主2021/10/31 15:49

思路挺常规的,因为题目要求不区分大小写,并且输出原字符串,那么就改一下max函数的比较方式。

#include<bits/stdc++.h>
using namespace std;
int n,m;
string a[500010];
struct node{
	int l,r;
	string maxn;
}tree[2000010];
string max1(string a,string b)//改一下比较方式不就完事了 
{
	string aa="",bb="";
	for(int i=0;i<a.size();i++)
	aa[i]=tolower(a[i]);
	for(int i=0;i<b.size();i++)
	bb[i]=tolower(b[i]);
	return aa>bb?a:b;
}
void build(int p,int l,int r)
{
	tree[p].l=l;
	tree[p].r=r;
	if(l==r)
	{
		tree[p].maxn=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	tree[p].maxn=max1(tree[p*2].maxn,tree[p*2+1].maxn);
}
string query1(int p,int l,int r)
{
	if(l<=tree[p].l&&tree[p].r<=r)
	{
		return tree[p].maxn;
	}
	int mid=(tree[p].l+tree[p].r)>>1;
	string ss="";
	if(l<=mid)
	ss=max1(ss,query1(p*2,l,r));
	if(r>mid)
	ss=max1(ss,query1(p*2+1,l,r));
	return ss;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	while(m--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		string s=query1(1,l,r);
		cout<<s;
		printf("\n");
	}
	return 0;
} 
2021/10/31 15:49
加载中...