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