题解 P2519 【[HAOI2011]problem a】
挺妙的一道题.
设
然后补集转化成说真话的人最多.对某个人的
于是问题转化成有
对这个问题我们已经有成熟的解决办法.按
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5e5;
int n,f[N];
struct Node{int x,y,w;}a[N];
int cmp(const Node &a,const Node &b){return a.y!=b.y?a.y<b.y:a.x<b.x;}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y),a[i].x++,a[i].y=n-a[i].y;
sort(a+1,a+n+1,cmp);
int nn=0;
for(int i=1,x=0,y=0;i<=n;i++)
{
if(a[i].x==x&&a[i].y==y)a[nn].w++;
else if(a[i].x<=a[i].y)a[++nn]=(Node){a[i].x,a[i].y,1},x=a[i].x,y=a[i].y;
}
for(int i=1;i<=nn;i++)a[i].w=min(a[i].w,a[i].y-a[i].x+1);
int j=1;
for(int i=1;i<=nn;i++)
{
while(j<=a[i].y)f[j]=max(f[j],f[j-1]),++j;//前缀max
f[a[i].y]=max(f[a[i].y],f[a[i].x-1]+a[i].w);
}
cout<<n-f[a[nn].y]<<endl;
}