SGU 119 Beautiful People

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxx 100050
struct node
{
    int a,b,id;
}g[maxx];
int root[maxx];
int id[maxx];
int len;
void output(int x)
{
    if(x==-1)return;
    output(root[x]);
    printf("%d ",g[x].id);
}
int cmp (node x,node y)
{
    if(x.a!=y.a)
    return x.a<y.a;
    return x.b>y.b;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&g[i].a,&g[i].b);
        g[i].id=i;
    }
    sort(g+1,g+n+1,cmp);
    int len=1;
    int l,r;
    id[0]=1;
    memset(root,-1,sizeof(root));
    for(int i=2;i<=n;i++)
    {
        if(g[i].b>g[id[len-1]].b)
        {
            id[len++]=i;
            root[i]=id[len-2];
            continue;
        }
        l=0;
        r=len-1;
        while(l<r)
        {
            int mid=(l+r)>>1;
            if(g[i].b>g[id[mid]].b) l=mid+1;
            else  r=mid;
        }
        id[l]=i;
        if(l==0)  root[l]=-1;
        else  root[i]=id[l-1];
    }
    printf("%d\n",len);
    output(id[len-1]);
    puts("");
}

SGU 119 Beautiful People

时间: 2024-11-10 11:41:33

SGU 119 Beautiful People的相关文章

SGU 119

欧几里得- -要分N种情况- - #include<cstdio> #include<algorithm> using namespace std; int gcd(int x,int y){if (y==0) return x;return gcd(y,x%y);} struct node { int x,y; friend bool operator < (const node &a, const node &b) { if(a.x != b.x) ret

SGU 199. Beautiful People 二维LIS

第一维排序 第二维LIS #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int dp[100010]; int p[100010]; struct node { int x, y, id; }a[100010]; bool cmp(node a, node b) { if(a.x != b.x) return a.x < b.x; return a.y

SGU 199 Beautiful People 二维最长递增子序列

题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20885 题意: 求二维最长严格递增子序列. 题解: O(n^2)的算法很好想,不过这里会t掉,只能O(nlogn) 于是用二分来维护: 先把所有的数按x递增排序,x相同的按y递减排序(这里之所以要按y递减排序是因为为了写代码方便,递减的话你后面基本就只要考虑y的大小,如果不递减,你还要考虑x的大小的,具体的可以自己思考一下) 排完序之后我们接下来就只考虑y的大小

SGU 199 - Beautiful People 最长上升子序列LIS

要邀请n个人参加party,每个人有力量值strength Si和魅力值 beauty Bi,如果存在两人S i ≤ S j and B i ≥ B j 或者  S i ≥ S j and B i ≤ B j 他们两个会产生冲突,问在不产生冲突的条件下,最多能邀请到几个人? [LIS]一开始将所有人按照Si升序排序,Si相同的按照Bi值降序排列,在这个基础上答案就是Bi的最长上升子序列的长度. 为什么Si相同时按照Bi值降序排列? 由求出的子序列时严格递增序列,如果对于相同的Si,Bi是递增,那

Magic Pairs - SGU 119(同余)

题目大意:如果A0*X + B0*Y能够整除 N,求出来多有少A*X+B*Y 也能够整除去N,求出所有的A,B(0<=A,B<N) 分析:有条件可以知道 A*X+B*Y = K *(A0*X + B0*Y)% N ====> (K * A0) % N = A, (K * B0) % N = B, (k=[0....N)). ps.记得排序去重复...... 代码如下: ============================================================

SGU 199 Beautiful People(DP+二分)

时间限制:0.25s 空间限制:4M 题意: 有n个人,每个人有两个能力值,只有一个人的两个能力都小于另一个的能力值,这两个人才能共存,求能同时共存的最大人数. Solution: 显然这是一个两个关键字的最长上升序列. 先按照第一种能力值为第一关键字从小到大,第二能力值为第二关键字从大到小排序(为什么?) 然后就是直接用O(nlogn)的DP就好了 (排序的方法是根据O(nlogn)DP算法中所用到的辅助数组的性质...如果对这个算法理解足够的话应该比较容易想到) code(要用C++提交)

CodeForces 665E Beautiful Subarrays

题目:Beautiful Subarrays 链接:Here 题意:给一个数组,给一个 '完美区间' 的定义:l 到r 区间内的所有数异或和大于等于k,问给定数组有多少完美区间. 思路: 异或运算可以前缀和处理,用w[i]表示i 前面的数异或和,那么w[5]^w[3]就是4.5两数异或的值. 现在我们要开始建字典树了(感觉异或和字典树老扯上关系),我们从前往后一个个地把前缀加入字典树(补齐,高位补0),在w[i]加入字典树前,判断w[i]和前面的哪个前缀可以异或并且值大于等于k.这里要用树形DP

SGU 438 The Glorious Karlutka River =) 拆点+动态流+最大流

The Glorious Karlutka River =) Time Limit:500MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice SGU 438 Appoint description: Description A group of Mtourists are walking along the Karlutka river. They want to cross

sgu Kalevich Strikes Back

这道题就是求一个大矩形被n个矩形划分成n+1个部分的面积,这些矩形之间不会相交,可能包含.. 1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 #include <algorithm> 5 #define maxn 120100 6 using namespace std; 7 8 long long s[maxn]; 9 vector<int>g[maxn]; 10 i