P10264 接竹竿 题解
T_TLucas_Yin · · 题解
注意到数据不是很大,所以可以用一种简单的方法过。
我们存下每一个
由于
15000
1 1 2 2 1 1 2 2 1 1 ...
15000
1 15000
1 15000
...
此时每次询问平均就需要遍历
为了避免超时,考虑进行优化:存储下每个区间的答案,对于重复的询问直接输出,这样就避免全程搜索整个序列的时间浪费,让极限情况下的总查询次数不超过
#include<bits/stdc++.h>
using namespace std;
map<pair<int,int>,int> ma;
int t,n,m,l,r,a[20005],f[100005];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int flag[15]={0};
for(int i=n;i>=1;i--) f[i]=flag[a[i]],flag[a[i]]=i;//f[i]表示第i个元素在其后第一次出现的位置
scanf("%d",&m);
ma.clear();
for(int i=1;i<=m;i++){
scanf("%d %d",&l,&r);
int cnt=0;
if(ma.count({l,r})){//这里存储的是上一次在序列中查询此区间的结果
printf("%d\n",ma[{l,r}]);
continue;
}
for(int j=l;j<=r;j++){
if(f[j]>=l&&f[j]<=r) j=f[j];
else cnt++;
}
ma[{l,r}]=cnt;
printf("%d\n",cnt);
}
}
return 0;
}