Cod sursa(job #490178)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 5 octombrie 2010 11:55:41
Problema NextSeq Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int nr,n,m,p,v[1<<14],a[1<<14],b[1<<14],cor[1<<14];
bool f[1<<14];
void read()
{
    freopen("nextseq.in","r",stdin);
    freopen("nextseq.out","w",stdout);
    scanf("%d%d%d",&n,&m,&p);
    for(int i=1;i<=n;i++)
        scanf("%d",&v[i]);
    for(int i=1;i<=m;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=p;i++)
        scanf("%d",&b[i]);
}
int search(int x)
{
    int pas=1<<14,i=0;
    for(i=0;pas;pas>>=1)
        if(i+pas<=n && v[i+pas]<x)
            i+=pas;
    return i+1;
}
void norm()
{
    int p=0;
    sort(v+1,v+n+1);
    v[0]=-1;
    for(int i=1;i<=n;i++)
        if(v[i]!=v[i-1])
            cor[i]=++p;
    for(int i=1;i<=n;i++)
        v[i]=cor[search(v[i])];
    for(int i=1;i<=m;i++)
        a[i]=cor[search(a[i])];
    for(int i=1;i<=p;i++)
        b[i]=cor[search(b[i])];
}
void egal()
{
    while(m<p)
    {
        ++m;
        for(int i=m;i>=1;i--)
            a[i]=a[i-1];
    }
}
void back(int poz,bool lb,bool ba)
{
    if(poz>m)
    {
        if(lb && ba)
            nr++;
        return;
    }
    for(int i=1;i<=n;i++)
        if(!f[i]&& ((lb==true || v[i]<=b[poz]) && (ba==true || v[i]>=a[poz])))
        {
            f[i]=true;
            if(lb==true)
            {
                if(ba==true)
                    back(poz+1,lb,ba);
                else
                {
                    if(v[i]>a[poz])
                        ba=true;
                    back(poz+1,lb,ba);
                    ba=false;
                }
            }
            else
            {
                if(v[i]<b[poz])
                    lb=true;
                if(ba==true)
                    back(poz+1,lb,ba);
                else
                {
                    if(v[i]>a[poz])
                        ba=true;
                    back(poz+1,lb,ba);
                    ba=false;
                }
                lb=false;
            }
            f[i]=false;
        }
}
int main()
{
    read();
    norm();
    egal();
    back(1,false,false);
    printf("%d",nr);
    return 0;
}