题解:AT_joig2022_e エゴイ展 (EGOI Exhibition)-数学解法

题目传送门

解题思路:

  • 本题只要区分类型是否和上一个一样即可。
  • 所以可以记录一个最大值,记录这个最大值的类型,记录一个和最大值不一样类型之中剩余的最大值
  • 则对于查询 \(t\) ,只有可能从 上述两个值之中查询。
  • 此时这种方法的实现,时间复杂度是 \(O(n)\) 。

AC Code:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e6 + 7;
int t[maxn];
int a[maxn];
int dp[maxn];
int maxx1 = 0;
int maxx2 = 0;
int x = 0, ans = 0;
signed main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        cin >> t[i] >> a[i];
    }
    for (int i = 1; i <= n; i++)
    {
        if (t[i] == x)
        {
            dp[i] = maxx2 + a[i];
            if (maxx1 < dp[i])
            {
                maxx1 = dp[i];
            }
        }
        else
        {
            dp[i] = maxx1 + a[i];
            if (dp[i] > maxx1)
            {
                maxx2 = maxx1;
                maxx1 = dp[i];
                x = t[i];
            }
            else
            {
                maxx2 = max(maxx2, dp[i]);
            }
        }
        ans = max(ans, dp[i]);
    }
    cout << ans << endl;
    return 0;
}
posted @ 2026-10-27 22:32  _starry_night  阅读(5)  评论(0)    收藏  举报