P11233 [CSP-S 2024] 染色
[P11233 [CSP-S 2024] 染色]
说句闲话:考场没想到应该从last+1转移,怒调1.5h后20pts遗憾离场
我们记
形式化的sum:
然后我们对于每个点i:f[i]=f[i-1];如果他有last:
f[i]=max(f[i],f[last+1]+s[i]-s[last+1]+a[i]);
我们考虑如何解释这个方程:
根据last的定义:
我们假设:
所以
如果我们从last转移到i的话,
对于有last的i:
f[last+1]保证是在
这样就保证了从f[last+1]转移到f[i]是合法的
然后这题就并不愉快的补完了
Code:
#include<bits/stdc++.h> #define int long long const int N=1e6+5; using namespace std; int a[N],last[N],f[N]; int n,inf; int sum[N]; inline void upd(int &x,int y) { x = (x>y ? x : y); } void work() { cin>>n; for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); last[a[i]]=0;f[i]=0; sum[i]=sum[i-1]; sum[i]+= (a[i]==a[i-1] ? a[i] : 0); } for(int i=1;i<=n;i++) { f[i]=f[i-1]; if(last[a[i]]) { int j=last[a[i]]+1; upd(f[i],f[j]+a[i]+sum[i]-sum[j]); } last[a[i]]=i; } printf("%lld\n",f[n]); } #undef int int main() { int T; cin>>T; while(T--) { work(); } return 0; }