题解:
虽然也是个可以过得做法。。。但又没有挖掘到最简单的做法。。。
正解是发现这个东西等价于求不相交区间个数
直接按照右端点排序,然后贪心就可以O(n)过了
而我的做法是按照a排序(其实我是在模拟这个过程但我没有发现他的本质。。。)
然后f[i][j]表示前i个,最大要求为j的最大值
然后用线段树来优化这个东西
一个地方存在的东西还要取个min
代码:
#includeusing namespace std;#define rint register int#define IL inline#define rep(i,h,t) for (rint i=h;i<=t;i++)#define dep(i,t,h) for (rint i=t;i>=h;i--)#define mid ((h+t)/2)const int N=2e5+100;struct re{ int a,b,c;}a[N],b[N];bool cmp(re x,re y){ return (x.a >n; rep(i,1,n) cin>>a[i].a>>a[i].b; sort(a+1,a+n+1,cmp); int l=0; rep(i,1,n) if (a[i].a==a[i-1].a&&a[i].b==a[i-1].b) b[l].c++,b[l].c=min(b[l].c,n-a[i].a-a[i].b); else { b[++l].a=a[i].a; b[l].b=a[i].b; b[l].c=1; } rep(i,1,l) { int x=S.find(1,1,n,1,b[i].a); S.change(1,1,n,n-b[i].b,x+b[i].c); } int ans=S.find(1,1,n,1,n); cout< <