Cod sursa(job #2042645)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 18 octombrie 2017 21:29:31
Problema P-sir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
# include <fstream>
# include <algorithm>
# define DIM 2010
# define MOD ((1LL)<<32)
using namespace std;
ifstream fin("psir.in");
ofstream fout("psir.out");
unsigned int s[DIM][DIM],v[DIM],sor[DIM],vec[DIM],d[DIM];
unsigned int n,k,i,j,sol;
long long aux;
int cauta(int val,int k){
    int step,j;
    for(step=1;step<=k;step*=2);
    for(j=0;step;step/=2)
        if(j+step<=k&&sor[j+step]<=val)
            j+=step;
    return j;
}
void verifica(long long &a){
    if(a>=MOD)
        a-=MOD;
    if(aux<0)
        aux+=MOD;
}
int main () {
    fin>>n;
    for(i=1;i<=n;i++){
        fin>>v[i];
        sor[i]=v[i];
    }
    sort(sor+1,sor+n+1);
    k++;
    for(i=2;i<=n;i++)
        if(sor[i]!=sor[k])
            sor[++k]=sor[i];
    for(i=1;i<=n;i++)
        v[i]=cauta(v[i],k);
    for(i=1;i<=n;i++){
        for(j=1;j<=k;j++){
            if(j==v[i])
                continue;
            vec[j]=s[v[i]][j]-s[v[i]][j-1];
            aux=vec[j];
            verifica(aux);
            vec[j]=aux;
        }
        vec[v[i]]=s[v[i]][k+1]-s[v[i]][k];
        aux=vec[v[i]];
        verifica(aux);
        vec[v[i]]=aux;
        for(j=0;j<=k;j++){
            if(j==0){
                aux=d[v[i]];
                aux++;
                verifica(aux);
                d[v[i]]=aux;
                continue;
            }
            if(v[i]==j){
                aux=vec[j];
                aux+=d[j]-1;
                verifica(aux);
                vec[j]=aux;
                continue;
            }
            if(v[i]>j){
                aux=vec[j];
                aux+=s[j][k]-s[j][v[i]];
                aux+=d[j];
                verifica(aux);
                vec[j]=aux;
            }
            else{
                aux=vec[j];
                aux+=s[j][v[i]-1];
                aux+=d[j];
                verifica(aux);
                vec[j]=aux;
            }
        }
        for(j=1;j<=k;j++){
            if(v[i]==j){
                s[v[i]][j]=s[v[i]][j-1];
                continue;
            }
            aux=s[v[i]][j-1];
            aux+=vec[j];
            verifica(aux);
            s[v[i]][j]=aux;
        }
        aux=s[v[i]][k];
        aux+=vec[v[i]];
        verifica(aux);
        s[v[i]][k+1]=aux;
    }
    for(i=1;i<=k;i++){
        aux=sol;
        aux+=s[i][k+1];
        verifica(aux);
        sol=aux;
    }
    fout<<sol<<"\n";
    return 0;
}