DQUERY spoj的优化

时间:2016-07-23 18:12:51

标签: c++ algorithm optimization

我正在尝试解决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]);
    }
}

0 个答案:

没有答案