浮水法-POJ2528
简单来说就是水上浮着n条线段,由下至上上浮,浮到一半有重叠了就换其中一半继续浮。
————————————1
——————————2
——3
——————————4
————————————————————5
_________6
如图6上浮,5无重叠,上浮,5有重叠,截去一半继续浮,之后上浮没有阻碍
#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
#define debug printf("*");
//#define mo 1e9+7
const int N=10010;
int c,n;
int l[N],r[N];
int iffloat(int L,int R,int bh){
while(bh<=n&&(r[bh]<L||R<l[bh])) bh++;
if(bh>n) return 1;
if(l[bh]<=L&&R<=r[bh]) return 0;//被吃了
bool flag=0;
if(L<l[bh]) flag=iffloat(L,l[bh]-1,bh+1);//吃了别人
if(flag==0&&r[bh]<R) flag|=iffloat(r[bh]+1,R,bh+1);
return flag;
}
int main(){
scanf("%d",&c);
while(c--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&l[i],&r[i]);
int ans=0;
for(int i=1;i<=n;i++){
if(iffloat(l[i],r[i],i+1)) ans++;
}
printf("%d\n",ans);
}
return 0;
}
QwQwQ