HDU 1025 Constructing Roads In JGShining's Kingdom

来源:互联网 发布:首席数据官 技能 编辑:程序博客网 时间:2024/06/08 18:48

这个题很明显了。


两条线段不相交,就是 在 一边排序之后 另一边求最大上升子序列。


#include <cstdio>#include <iostream>#include <string>#include <algorithm>#include <cstring>using namespace std;#define MAXN 500000+10#define INF 1 << 30struct Road{    int we;    int sp;    friend bool operator < (Road a, Road b){        return a.we < b.we;    }};int d[MAXN];int g[MAXN];Road s[MAXN];int main (){    int x,y;    int kase = 0;    int n;    while(scanf("%d", &n) != EOF){        memset(s,0,sizeof(s));        for(int i = 0; i < n; i++)            scanf("%d%d",&s[i].we,&s[i].sp);        sort(s,s+n);        int M = 0;        for(int i = 0; i <= n; i++)            d[i] = 1;        for(int i = 0; i <= n; i++)            g[i] = INF;        int ans = 0;        for(int i = 0; i < n; i++){            int k = lower_bound(g+1, g+n+1, s[i].sp) - g;            d[i] = k;  //  到  i  这个数的时候  前面有多少个数。            g[k] = s[i].sp;            ans = max(ans, d[i]);        }        printf("Case %d:\n", ++kase);        if(ans == 1)            printf("My king, at most %d road can be built.\n\n",ans);        else    }    return 0;}


0 0