zoukankan      html  css  js  c++  java
  • Codeforces Round #673 (Div. 2) C. k-Amazing Numbers(思维)

    题目链接:https://codeforces.com/contest/1417/problem/C

    题意

    给出一个大小为 $n$ 的数组 $a$,计算当 $k$ 从 $1$ 到 $n$ 取值时在所有 $k$ 长区间中出现的数的最小值。

    题解

    记录一个值两两间的最大距离,该距离的 $k$ 长区间及之后更长的区间都可能以该值为最小值。

    Tips

    注意两端的处理。

    代码一

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int t;
        cin >> t;
        while (t--) {
            int n;
            cin >> n;
            vector<int> pre(n + 1), dis(n + 1);
            for (int i = 1; i <= n; i++) {
                int x;
                cin >> x;
                dis[x] = max(dis[x], i - pre[x]);
                pre[x] = i;
            }
            for (int i = 1; i <= n; i++) {
                if (pre[i]) {
                    dis[i] = max(dis[i], n + 1 - pre[i]);
                }
            }
            vector<int> ans(n + 1, 1e9);
            for (int i = 1; i <= n; i++) {
                ans[dis[i]] = min(ans[dis[i]], i);
            }
            for (int i = 2; i <= n; i++) {
                ans[i] = min(ans[i], ans[i - 1]);
            }
            for (int i = 1; i <= n; i++) {
                cout << (ans[i] == 1e9 ? -1 : ans[i]) << " 
    "[i == n];
            }
        }
        return 0;
    }

    代码二

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        int t;
        cin >> t;
        while (t--) {
            int n;
            cin >> n;
            vector<vector<int>> pos(n + 1, {0});
            for (int i = 1; i <= n; i++) {
                int x;
                cin >> x;
                pos[x].push_back(i);
            }
            for (int i = 1; i <= n; i++) {
                pos[i].push_back(n + 1);
            }
            vector<int> dis(n + 1);
            for (int i = 1; i <= n; i++) {
                if (pos[i].size() > 2) {
                    for (int j = 1; j < int(pos[i].size()); j++) {
                        dis[i] = max(dis[i], pos[i][j] - pos[i][j - 1]);
                    }
                }
            }
            vector<int> ans(n + 1, 1e9);
            for (int i = 1; i <= n; i++) {
                ans[dis[i]] = min(ans[dis[i]], i);
            }
            for (int i = 2; i <= n; i++) {
                ans[i] = min(ans[i], ans[i - 1]);
            }
            for (int i = 1; i <= n; i++) {
                cout << (ans[i] == 1e9 ? -1 : ans[i]) << " 
    "[i == n];
            }
        }
        return 0;
    }

    参考博客

    https://www.cnblogs.com/petjelinux/p/13742723.html

  • 相关阅读:
    Python中webbrowser的用法
    python爬虫笔记
    PHP yii2.0框架利用mpdf导出pdf
    PyQt5中QTableWidget设置列宽大小的几种方式
    看linux正在运行的服务用哪个命令?
    查看SELinux状态
    查看SMB服务器用户
    centOS7 下安装smb服务器
    (samba启动失败)smb.service: main process exited, code=exited, status=1/FAILURE
    Linux 操作日志
  • 原文地址:https://www.cnblogs.com/Kanoon/p/13748511.html
Copyright © 2011-2022 走看看