C. Medium Design
题解
假设最优解的最大值点在x,那么我们可以把所有和x无交集的线段全部删掉,抽象地感觉,从x往两边扩散,每个点覆盖的线段数越来越少,因此最小值点不是在1,就是在m
由于已知最小值点,我们把所有和最小值点有交集的线段全部删掉,这样假如最大值点和最小值点有共同线段,不改变答案,假如没有共同线段,答案加一,所以这样肯定是可以的
设两个前缀和,分别表示不与两个最小值点有交集的线段累计
code
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
map<int,int> q1,q2;
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
if(x!=1)
{
q1[x]++;
q1[y+1]--;
}
if(y!=m)
{
q2[x]++;
q2[y+1]--;
}
}
int ans=0,cnt=0;
for(auto it:q1)
{
cnt+=it.second;
ans=max(ans,cnt);
}
cnt=0;
for(auto it:q2)
{
cnt+=it.second;
ans=max(ans,cnt);
}
cout<<ans<<endl;
}
return 0;
}

浙公网安备 33010602011771号