zoukankan      html  css  js  c++  java
  • [LOJ#10042] 收集雪花

    题目链接:###

    点我

    题目分析:###

    双指针扫描可以保证在(O(n))的时间复杂度内处理这道题。另外,虽然这个题标签是(hash),但是字符串(hash)是可以卡掉的,所以建议直接离散化
    维护两个指针(l)(r),并维护一个(bool)数组记录在当前区间内某个数是否出现过。(r)指针右移并记录区间长度,当(bool[r]=true)时说明(a[r])重复出现过了,这时将(l)指针右移到(a[r])上次出现的位置,并更新(ans)

    一般地,对于需要将数字映射到有限空间的情况,离散化远远比字符串哈希更为稳妥。

    2019.8.3 UPD:前两天写Oil的时候了解到双指针扫描其实有一个专门的名字,叫尺取法,是个普及知识点。但是双指针扫描在不合法情况时就直接丢掉的策略很多时候对程序优化有奇效,而且是一种比较灵活的写法(其实就是靠脑补……),反正蛮神奇的,思想可以学习

    代码:###

    #include <bits/stdc++.h>
    #define N (1000000 + 5)
    using namespace std;
    inline int read() {
        int cnt = 0, f = 1;
        char c;
        c = getchar();
        while (!isdigit(c)) {
            if (c == '-')
                f = -f;
            c = getchar();
        }
        while (isdigit(c)) {
            cnt = cnt * 10 + c - '0';
            c = getchar();
        }
        return cnt * f;
    }
    int n, a[2 * N], b[2 * N], l = 1, r, cnt, ans;
    bool flag[N];
    void Discretize() {  //离散化
        sort(b + 1, b + n + 1);
        int q = unique(b + 1, b + n + 1) - b;
        for (register int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + q + 1, a[i]) - b;
    }
    int main() {
        memset(flag, false, sizeof(flag));
        n = read();
        for (register int i = 1; i <= n; i++) b[i] = a[i] = read();
        Discretize();
        //	for(register int i=1;i<=n;i++) cout<<a[i]<<" ";
        for (r = 1; r <= n; r++) {
            if (!flag[a[r]])
                ans = max(ans, ++cnt);
            else {
                while (a[l] != a[r]) {
                    flag[a[l]] = false;
                    l++;
                }
                ++l;
                cnt = r - l + 1;
            }
            flag[a[r]] = true;
        }
        printf("%d", ans);
        return 0;
    }
    
  • 相关阅读:
    npm执行清理缓存失败npm cache clean
    Vue中计算属性(computed)和监听属性函数watch的比较
    vue生命周期函数
    vue自定义指令
    vue 自定义过滤器
    vue 自定义全局按键修饰符
    线性回归模型
    python常用模块
    KNN算法的实现
    python集合(set)的运算
  • 原文地址:https://www.cnblogs.com/kma093/p/10386988.html
Copyright © 2011-2022 走看看