CF1843E Tracking Segments

题目链接:https://www.luogu.com.cn/problem/CF1843E

思路: 题目要求至少第几次修改后满足给定的一个区间是美丽区间.我们发现修改操作是有单调性的,随着修改次数的增加,那么满足的美丽区间数量一定会保持不变或增多.因此我们选择二分答案,二分修改次数.

二分答案的check函数就根据美丽区间的定义来写.很多区间01问题实际上就转换成区间和问题即可,在这里用前缀和维护.

代码

#define maxn 200010
int a[maxn];
int b[maxn];
int q[maxn];
int l[maxn],r[maxn];
int n,m;
bool check(int x)
{
    for(int i=0;i<=n;i++)
    {
        b[i]=0;
    }
    for(int i=1;i<=x;i++)
    {
        b[q[i]]=1;
    }
    for(int i=1;i<=n;i++)
    {
        b[i]+=b[i-1];
    }
    for(int i=1;i<=m;i++)
    {
        if(b[r[i]]-b[l[i]-1]>r[i]-l[i]+1-(b[r[i]]-b[l[i]-1]))
        {
            return 1;
        }
    }
    return 0;
}
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>l[i]>>r[i];
    }
    int xx;
    cin>>xx;
    for(int i=1;i<=xx;i++)
    {
        cin>>q[i];
    }
    int l=1;
    int r=xx;
    int ans=-1;
    while(l<=r)
    {
        int mid =(l+r)>>1;
        if(check(mid)) {
            r=mid-1;
            ans=mid;
        }
        else l=mid+1;
    }
    cout<<ans<<endl;
    
}
posted @ 2024-05-29 10:23  Captainfly19  阅读(5)  评论(0编辑  收藏  举报