CF1843E Tracking Segments

Captainfly19發表於2024-05-29

題目連結: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;
    
}

相關文章