CF1927D 题解

O(T(n+q)) 做法,不用任何 ds ,简单易懂。

题意简述

多组数据。

每组数据给你一个长度为 n 的序列 aq 次询问,每次询问有 l,r ,问你在 a[l,r] 区间内存不存在两个不一样的数,如果有,输出他们两个的下标,没有输出 -1

数据范围:n,q2×105

解法

对于每个数 ai,记录它往左第一个不一样的数的下标,记为 lsti ,则有:

如果 aiai1 ,则 lsti=i1

如果 ai=ai1 ,则 lsti=lsti1

式子很好想到,不多做赘述。

所以,对于每个询问 [l,r] ,如果 lstr<l ,就说明在这个区间内没有数不一样,直接输出 -1 ,反之,输出 lstrr 即可。

每组数据预处理 O(n) ,查询 O(q)

代码

#include <bits/stdc++.h>
using namespace std;

const int N=2e5+10,M=2e6+10;
int n,a[N];
int q;
int lst[N];

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	int t;
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++)cin>>a[i];
		for(int i=1;i<=n;i++){
			if(a[i]!=a[i-1]){
				lst[i]=i-1;
			}else{
				lst[i]=lst[i-1];
			}
		}
		cin>>q;
		while(q--){
			int l,r;
			cin>>l>>r;
			if(lst[r]<l)cout<<"-1 -1\n";
			else{
				cout<<lst[r]<<' '<<r<<'\n';
			}
		}
		cout<<'\n';
	}
	return 0;
}

posted @   Linge_Zzzz  阅读(2)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示