Paint the Middle (提取信息转化为熟悉问题->线段覆盖问题)

- 通过题目信息来进行转化成熟悉的问题
- 首先提取出性质 a ......a 里面的数都可以改, 然后 选择最远的2个a a 是最优的
- 于是就有 很多区间, 可能交互, 就贪心让更少的区间占领更长的地方就可以
- 具体实现看代码

#include <bits/stdc++.h> using namespace std; #define ri int #define M 2000005 int T; int dp[M]; int p[M]; int n,m; int main(){ cin>>n; for(ri i=1;i<=n;i++) { int a; cin>>a; p[i]=a; dp[a]=i; } int ans=0; int r=0,now=0,l=0; for(ri i=1;i<=n;i++) { if(i>r&&dp[p[i]]==i) continue; if(i>r) { l=i; ans--; r=dp[p[i]]; } if(i<r) { if(dp[p[i]]>r&&dp[p[i]]>now) { now=dp[p[i]]; } } if(i==r) { if(now==0) { ans+=i-l; l=0; } else { r=now; ans--; now=0; } } } cout<<ans; return 0; }