解题思路:
- 本题只要区分类型是否和上一个一样即可。
- 所以可以记录一个最大值,记录这个最大值的类型,记录一个和最大值不一样类型之中剩余的最大值
- 则对于查询 \(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;
}