CF1932(div3)题解
F - Feed Cats
题意: 有多个区间,每个区间内只能选一个点,问最多可以选择多少个区间
思路:
考虑dp
- 差分,然后算前缀和可以判断选择当前点的贡献
- 预处理选择当前点后最右边的不能选的点
- $ 不选i,则dp_i=max(dp_i,dp_{i-1}) $
- $ 选i,则dp_{R_i+1}=max(dp_{R_i+1},dp_i+cnt) $
- $ 答案为dp_{n+1} $
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
void solve(){ int n,m; cin>>n>>m; vector<int> b(n+10),dp(n+10),R(n+10); for(int i=1;i<=m;i++){ int l,r; cin>>l>>r; b[l]++; b[r+1]--; R[l]=max(R[l],r); } for(int i=1;i<=n;i++)R[i]=max(R[i],R[i-1]); int cnt=0; for(int i=1;i<=n+1;i++){ cnt+=b[i]; dp[i]=max(dp[i],dp[i-1]); if(R[i])dp[R[i]+1]=max(dp[R[i]+1],dp[i]+cnt); } cout<<dp[n+1]<<"\n"; }
This post is licensed under CC BY 4.0 by the author.