BZOJ2083:[POI] TES-Intelligence Test

BZOJ2083:[POI] TES-Intelligence Test

給定一個數串,和m個小數串,問這些小串都是不是大數字串的子序列

思路

vector 容器儲存每一個數字的位置,記last 保存當前序列check 的值在母序列中的合法位置,二分查找ai 在母序列中的大於等於last 的值,如果能找到這樣的位置,繼續check ,如果找不到,即該序列不合法

時間複雜度O(L+n)

#include <cstdio>
#include <algorithm>
#include <vector>

using namespace std;

const int MAXN = 1000000+10;

vector <int> v[MAXN];

int n,m,a,k;

void Read(int &x)
{
    int in=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9')   {if(f=='-')f=-1;ch=getchar();}
    while(ch>='0' && ch<='9') {in=in*10+ch-'0';ch=getchar();}
    x=in*f;
}

int main()
{

    Read(n);
    for(int i=1;i<=n;i++)
    {
        Read(a);
        v[a].push_back(i);
    }

    Read(m);
    for(int i=1;i<=m;i++)
    {
        Read(k);

        bool flag=1;int last=0;

        vector<int>::iterator node;

        for(int j=1;j<=k;j++)
        {
            Read(a);
            if(flag)
            {
                node = upper_bound(v[a].begin(),v[a].end(),last);
                if(node == v[a].end() ) flag=0;
                else last = *node;
            }
        }

        if(flag)    puts("TAK");
        else puts("NIE");

    }

    return 0;

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章