起点到终点经过尽可能多的点

#include
using namespace std;
typedef long long ll;
const int maxn=1e5+30;
struct node{
    int x,y;
}a[maxn],b[maxn];
int li[maxn],imin[maxn],cnt;
bool cmp1(node i,node j){
    if(i.x!=j.x)return i.xj.x;
    return i.y0;i-=i&-1)
        res=max(res,imin[i]);
    return res;
}
void update(int pos,int num){
    for(int i=pos;i<=cnt;i+=i&-i){
        if(imin[i]>n>>x0>>y0>>x1>>y1;
    int minx=min(x0,x1);
    int maxx=max(x0,x1);
    int miny=min(y0,y1);
int maxy=max(y0,y1);
//得到了X,Y的较小较大值
    if(x0>x1){
        swap(x0,x1);
        swap(y0,y1);
    }
    //保证了X0不比X1大
    int tot=0;
    cnt=0;
    for(int i=0;i>a[i].x>>a[i].y;
if(a[i].x<=maxx&&a[i].x>=minx
&&a[i].y<=maxy&&a[i].y>=miny)
            b[++tot]=a[i],li[++cnt]=b[tot].y;
    }
//如果输入的点合法就压入B
//且把B数组的Y坐标再记录
    sort(li+1,li+1+cnt);
    cnt=unique(li+1,li+1+cnt)-li-1;
//对Y坐标排序去重
//CNT为不同的Y值的数量-1
for(int i=1;i<=tot;i++){
b[i].y=lower_bound(li+1,li+1+cnt,b[i].y)-li;
    }//每点Y记为在所有点由下到上排第几
    if(x1>=x0&&y1>=y0)//Y1在上就X升Y升
        sort(b+1,b+1+tot,cmp1);
    else//如查Y1在下面就X降序,Y升序
        sort(b+1,b+1+tot,cmp2);
int ans=0;
//最后扫一次自更新ANS即可
    for(int i=1;i<=tot;i++){ 
        int tmp=cal(b[i].y)+1;
        ans=max(ans,tmp);
        update(b[i].y,tmp);
    }
    cout<

 

你可能感兴趣的:(ACM笔记-3图流)