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

  • 相关阅读:
    .Net网站的web.config配置说明
    listview垂直滚动条效果
    .net 委托事件
    利用API实现窗体淡入淡出特效
    易经中的64个大智慧
    FlashWindowEx实现窗口在任务栏闪烁/变化颜色
    实现XML与DataTable互转 .NET
    C# .NET弹出窗口
    SVN使用教程
    在IE中使用VS.net WinForm控件
  • 原文地址:https://www.cnblogs.com/Kanoon/p/13748511.html
Copyright © 2011-2022 走看看