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;


}
View Code

 

posted @ 2023-02-24 12:33  VxiaohuanV  阅读(17)  评论(0编辑  收藏  举报