BZOJ 2083 vector的巧用+二分

2083: [Poi2010]Intelligence test

Time Limit: 10 Sec  Memory Limit: 259 MB
Submit: 469  Solved: 227
[Submit][Status][Discuss]

Description

霸中智力测试机构的一项工作就是按照一定的规则删除一个序列的数字,得到一个确定的数列。Lyx很渴望成为霸中智力测试机构的主管,但是他在这个工作上做的并不好,俗话说熟能生巧,他打算做很多练习,所以他希望你写一个程序来快速判断他的答案是否正确。

Input

第一行为一个整数m(1<=m<=1000000)第二行包括m个用空格分开的整数ai(1<=ai<=1000000),组成了最初的序列,第三行为一个整数n(1<=n<=1000000),表示n个Lyx经过一系列删除得到的序列,每个序列两行,第一行给出长度L(1<=L<=m),然后下一行为L个由空格分开的整数bi(1<=bi<=1000000)。

Output

共n行,如果Lyx的序列确实是由最初的序列删除一些数得到,就输出TAK,否则输出NIE。

Sample Input

7
1 5 4 5 7 8 6
4
5
1 5 5 8 6
3
2 2 2
3
5 7 8
4
1 5 7 4

Sample Output

TAK
NIE
TAK
NIE
 
 
思路:= =感觉输入量好大啊,而且我也没有会员,不知道我写的方法是wa还是tle还是AC,就先暂时贴出来就好了
将a中的每个数值都预处理出来,放出vector中,其中定义vector<int> ve[i]表示,数值为i的出现在a中的位置集合。
然后我们暴力b串,并二分在a中的位置即可。(总感觉这个数据范围好像有毒啊)
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha
")
const int maxn = 2e6 + 5;
int n, m;
vector<int> ve[maxn];
vector<int>::iterator it;
int main(){
    scanf("%d", &m);
    int a;
    for (int i = 1; i <= m; i++){
        scanf("%d", &a);
        ve[a].push_back(i);
    }
    scanf("%d", &n);
    for (int i = 1; i <= n; i++){
        int k; scanf("%d", &k);
        bool flag = true;
        int pos = 0;
        for (int j = 1; j <= k; j++){
            int b; scanf("%d", &b);
            if (flag){
                it = upper_bound(ve[b].begin(), ve[b].end(), pos);
                if (it == ve[b].end()) flag = false;
                else pos = *it;
            }
        }
        if (flag) puts("TAK");
        else puts("NIE");
    }
    return 0;
}
View Code
 
 
 
原文地址:https://www.cnblogs.com/heimao5027/p/6430892.html