题目链接: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;
}
标签:Tracking,int,Segments,CF1843E,mid,xx,maxn,区间
From: https://www.cnblogs.com/captainfly/p/18219642