Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 23467 Accepted Submission(s): 6710
题目链接:HDU 1025
懂了求一般一维LIS的一般方法就可以做了,只是把lowerbound改一下和排序方式改一下……WA几次发现不可以用自己写的排序比较来二分,因为一旦遇到一个l<t.l就会返回true,然而二分是找一个位置不仅使得l<t.l且显然要r<t.r,然后自己写了个自定义函数作为lowerbound参数就过了
代码:
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(x,y) memset(x,y,sizeof(x))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=500010;
struct info
{
int l,r;
bool operator<(const info &t)const
{
if(l!=t.l)
return l<t.l;
return r<t.r;
}
};
info node[N];
info d[N];
bool check(const info &a,const info &b)//这里要重写,跟结构体里的还是有区别的
{
return a.l<b.l&&a.r<b.r;
}
void init()
{
CLR(node,0);
CLR(d,0);
}
int main(void)
{
int tcase=0,n,i;
while (~scanf("%d",&n))
{
init();
for (i=1; i<=n; ++i)
{
scanf("%d%d",&node[i].l,&node[i].r);
}
sort(node+1,node+1+n);
int len=1;
d[len]=node[len];
for (i=2; i<=n; ++i)
{
if(d[len].l<node[i].l&&d[len].r<node[i].r)
d[++len]=node[i];
else
{
int pos=lower_bound(d,d+len,node[i],check)-d;
d[pos]=node[i];
}
}
printf("Case %d:\nMy king, at most %d road%s can be built.\n\n",++tcase,len,len>1?"s":"");
}
return 0;
}
HDU 1025 Constructing Roads In JGShining's Kingdom(二维LIS)
原文:http://www.cnblogs.com/Blackops/p/5856137.html