zoukankan      html  css  js  c++  java
  • 【wikioi】1230 元素查找(巨水题+set/hash)

    http://wikioi.com/problem/1230/

    这题我真的不好意思写题解了。。。set练手。。

    #include <cstdio>
    #include <set>
    using namespace std;
    int main() {
        int n, m, t;
        scanf("%d%d", &n, &m);
        set<int> s;
        for(int i=1; i<=n; ++i) scanf("%d", &t), s.insert(t);
        for(int i=1; i<=m; ++i) scanf("%d", &t), s.count(t)?puts("YES"):puts("NO");
     	return 0;   
    }
    

    还是写第二种方法吧,hash。(速度比第一种快)

    (我从来没写过啊囧,但是一看就会了,太简单了。。)

    我们一般是用mod来做hash的,但是有时会有冲突,肿莫办!!!!!

    哈哈,很简单,如果有冲突我就往后跑,往后占!!!查找也是一样,不等于就往后跑,往后占!!

    这样,hash的空间就可以压很小了。(但是注意,如果范围很密集,这样做会失效。。。)

    #include <cstdio>
    #include <set>
    using namespace std;
    int a[100009], md=100007;
    void ins(const int &x) { for(int k=x%md; a[k]!=x; k=(k+1)%md) if(!a[k]) { a[k]=x; return; } }
    int sea(const int &x) { for(int k=x%md; a[k]!=x; k=(k+1)%md) if(!a[k]) return 0; return 1; }
    int main() {
        int n, m, t;
        scanf("%d%d", &n, &m);
        set<int> s;
        for(int i=1; i<=n; ++i) scanf("%d", &t), ins(t);
        for(int i=1; i<=m; ++i) scanf("%d", &t), sea(t)?puts("YES"):puts("NO");
     	return 0;   
    }
    

    给出n个正整数,然后有m个询问,每个询问一个整数,询问该整数是否在n个正整数中出现过。

    第一行两个整数 n 和m。

    第二行n个正整数(1<=n<= 100000)

    第三行m个整数(1<=m<=100000)

    一共m行,若出现则输出YES,否则输出NO

    4 2

    2 1 3 4

    1 9

    YES

    NO

    所有数据都不超过10^8

  • 相关阅读:
    PAT 甲级1135. Is It A Red-Black Tree (30)
    AVL树模板
    定时器模板
    Listview模板
    Hash二次探测
    BFS小结
    STL之set篇
    完全二叉树-已知中序排序,输出广度排序
    BZOJ2037: [Sdoi2008]Sue的小球
    poj1157LITTLE SHOP OF FLOWERS
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3932021.html
Copyright © 2011-2022 走看看