sgu 199 Beautiful People dp

原创 2013年12月02日 18:01:44

       在网上看了个思路,按x递增排序,x相同按y递减排序..然后求一个y的最长上升序列就行..这思路太神了,因为y在x相同的组内是递减的,所以找到一个更大的时,x一定更大..由于长度有10W,求上升序列的时候需要维护一个单调栈+二分,上升序列的长度就是栈的最大深度。路径没有特殊的要求,可行的都可以,每个点记录一下上一个的位置,最后递归或者循环一下输出就可以。

        

#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int maxn=140000;
int n,p,q;
int stack[maxn];
int top;
int pre[maxn];
struct node
{
    int x,y,idx;
    bool operator<(const node& p)const
    {
       if (x!=p.x) return x<p.x;
       return y>p.y;
    }
    node(){}
    node(int a,int b,int c)
    {
        x=a;
        y=b;
        idx=c;
    }
}a[maxn];

void print(int k)
{
    if (k==-1) return;
    print(pre[k]);
    printf("%d ",a[k].idx);
}
int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d",&n);
    for (int i=0; i<n; i++)
    scanf("%d%d",&a[i].x,&a[i].y),a[i].idx=i+1;
    sort(a,a+n);
    memset(stack,0,sizeof stack);
    memset(pre,-1,sizeof pre);

    top=0;
    top++;
    stack[0]=-1;
    stack[top]=0;
    pre[0]=-1;
    int l,r,m;
    for (int i=1; i<n; i++)
    {
        if (a[i].y>a[stack[top]].y)
        {

            top++;
            stack[top]=i;
            pre[i]=stack[top-1];

        }
        else
        {
            l=1; r=top;
            while (l<r)
            {
                m=(l+r)>>1;
                if (a[stack[m]].y<a[i].y) l=m+1;
                else r=m;
            }
            stack[l]=i;
            pre[i]=stack[l-1];
        }
    }
    printf("%d\n",top);
    print(stack[top]);
    puts("");
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

SGU--199 beautiful people

题意:一个土豪俱乐部里面的人勾心斗角,如果

ZOJ Problem Set - 2319 Beautiful People || sgu 199

这题WA了 21 次~~  终于过了~ 用到了求最长升序序列的O(nlgn) 解法! 可能是我的二分写的有问题吧~这题我到现在还是不知道为什么会在test 18 WA! 算法很多人都知道~这里...
  • xxx_bug
  • xxx_bug
  • 2012年05月09日 13:36
  • 1234

sgu 199 Beautiful People

199. Beautiful People time limit per test: 0.5 sec. memory limit per test: 65536 KB input: stan...
  • utoppia
  • utoppia
  • 2012年11月08日 12:31
  • 622

ACdream 1216 (ASC训练1) Beautiful People(DP)

题目地址:http://acdream.info/problem?pid=1216 这题一开始用的是线段树,后来发现查询的时候还需要DP处理,挺麻烦。。也就不了了之了。。后来想到,这题其实就是一个二...

ZOJ - 2319 Beautiful People(dp+STL)

Beautiful People Time Limit: 5 Seconds      Memory Limit: 32768 KB      Special Judge The most...

Acdream 1126 Beautiful People(最长上升子序列,dp+线段树优化)

先按x排序,对于相同的x分块处理,也就是

最长递增子序列 O(NlogN)算法,mark数组。ZOJ Problem Set - 2319— Beautiful People

题意:题目让求n对数中,最多有多少对满足题意的数字,并输出他们的编号(如果一对数的两个数字都分别大于另一对数的两个数,那么这两个就是符合题意的,求最多能有多少对(他们中的任意两个都要符合题意)) 思路...

zoj 2319 Beautiful People

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1319 题目大意:就是求最长递增子序列,并输出位置。。。。 思路:先把...

ZOJ2319 Beautiful People(贪心,最长递增子序列nlogn,LIS)

题目: Beautiful People Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge Th...

ACderamoj 1216 Beautiful People 二路最长单调递增序列

题目链接:http://acdream.info/problem?pid=1216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:sgu 199 Beautiful People dp
举报原因:
原因补充:

(最多只允许输入30个字)