我正在尝试解决this:
给定n个数字序列a_1,a_2,...,a_n和多个d查询。 d查询是一对(i,j)(1≤i≤j≤n)。对于每个d查询(i,j),您必须返回子序列a_i,a_(i + 1),...,a_j中不同元素的数量。
以下是我的方法(使用MO的算法),但它正在进行TLE(超出时间限制)。我在互联网上看到它写的MO的算法没问题,但是我的代码正在给TLE。有什么建议吗?
#include<bits/stdc++.h>
#define gc getchar_unlocked
#define ll int
using namespace std;
void scanint(int &x)
{
register int c = gc();
x = 0;
for(;(c<48 || c>57);c = gc());
for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}
}
void scanll(ll &x)
{
register ll c = gc();
x = 0;
for(;(c<48 || c>57);c = gc());
for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}
}
ll a[30001],count1[1000001],ans;
void add(ll ele){
++count1[ele];
if(count1[ele]==1)
++ans;
}
void remove(ll ele){
--count1[ele];
if(count1[ele]<1)
--ans;
}
pair<ll,pair<ll,ll> > query[200001];
ll answer[200001];
main(){
int n,q;
// freopen("in.txt","r",stdin);
scanint(n);
for(int i=0;i<n;++i){
scanll(a[i]);
}
scanint(q);
memset(count1,0,sizeof(count1));
int l,r,startl=0,startr=0;
ans=0;
count1[a[0]]++;
ans++;
int q1=q;
while(q--){
scanint(l);
scanint(r);
--l;
--r;
query[q1-q-1]=make_pair(l,make_pair(r,q1-q-1));
}
//cout<<q1<<endl;
sort(query,query+q1);
int i=0;
while(q1--){
while(startr<query[i].second.first){
add(a[++startr]);
// cout<<"hi\n";
}
while(startr>query[i].second.first){
remove(a[startr--]);
// cout<<"hi\n";
}
while(startl<query[i].first){
remove(a[startl++]);
}
while(startl>query[i].first){
add(--startl);
}
answer[query[i].second.second]= ans;
//cout<<ans<<endl;
++i;
}
//cout<<i<<endl;
for(int j=0;j<i;++j){
printf("%d\n",answer[j]);
}
}