zoukankan      html  css  js  c++  java
  • AC日记——凌乱的yyy 洛谷 P1803

    题目背景

    快noip了,yyy很紧张!

    题目描述

    现在各大oj上有n个比赛,每个比赛的开始、结束的时间点是知道的。

    yyy认为,参加越多的比赛,noip就能考的越好(假的)

    所以,他想知道他最多能参加几个比赛。

    由于yyy是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加2个及以上的比赛。

    输入输出格式

    输入格式:

    第一行是一个整数n ,接下来n行每行是2个正整数ai,bi(ai<bi),表示比赛开始、结束的时间。

    输出格式:

    一个整数最多参加的比赛数目。

    输入输出样例

    输入样例#1:
    3
    0 2
    2 4
    1 3
    
    输出样例#1:
    2
    

    说明

    对于20%的数据,n≤10;

    对于50%的数据,n≤1000;

    对于70%的数据,n≤100000;

    对于100%的数据,n≤1000000,0≤ai<bi≤1000000。

    思路:

      dp;

      线段树优化的dp(+_+);

    来,上代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    
    #define maxn 1000005
    
    using namespace std;
    
    struct SectionType {
        int l,r;
    };
    struct SectionType section[maxn];
    
    struct TreeNodeType {
        int l,r,dis,mid;
    };
    struct TreeNodeType tree[maxn<<2];
    
    int if_z,n,lit;
    
    char Cget;
    
    inline void in(int &now)
    {
        now=0,if_z=1,Cget=getchar();
        while(Cget>'9'||Cget<'0')
        {
            if(Cget=='-') if_z=-1;
            Cget=getchar();
        }
        while(Cget>='0'&&Cget<='9')
        {
            now=now*10+Cget-'0';
            Cget=getchar();
        }
        now*=if_z;
    }
    
    bool cmp(struct SectionType a,struct SectionType b)
    {
        if(a.r==b.r) return a.l>b.l;
        else return a.r<b.r;
    }
    
    void tree_build(int now,int l,int r)
    {
        tree[now].l=l,tree[now].r=r;
        if(l==r) return ;
        tree[now].mid=(l+r)>>1;
        tree_build(now<<1,l,tree[now].mid);
        tree_build(now<<1|1,tree[now].mid+1,r);
    }
    
    void tree_change(int now,int to,int x)
    {
        if(tree[now].l==tree[now].r)
        {
            tree[now].dis=x;
            return ;
        }
        if(to>tree[now].mid) tree_change(now<<1|1,to,x);
        else tree_change(now<<1,to,x);
        tree[now].dis=max(tree[now<<1].dis,tree[now<<1|1].dis);
    }
    
    int tree_query(int now,int l,int r)
    {
        if(tree[now].l==l&&tree[now].r==r) return tree[now].dis;
        if(l>tree[now].mid) return tree_query(now<<1|1,l,r);
        else if(r<=tree[now].mid) return tree_query(now<<1,l,r);
        else return max(tree_query(now<<1,l,tree[now].mid),tree_query(now<<1|1,tree[now].mid+1,r));
    }
    
    int main()
    {
        in(n);
        for(int i=1;i<=n;i++) in(section[i].l),in(section[i].r);
        sort(section+1,section+n+1,cmp);lit=section[n].r;
        tree_build(1,0,lit);
        for(int i=1;i<=n;i++)
        {
            int pos=tree_query(1,0,section[i].l)+1;
            if(pos>tree_query(1,section[i].r,section[i].r)) tree_change(1,section[i].r,pos);
        }
        cout<<tree[1].dis;
        return 0;
    }
  • 相关阅读:
    POJ 1703 Find them, Catch them
    POJ 2236 Wireless Network
    POJ 2010 Moo University
    POJ 2184 Cow Exhibition
    POJ 3280 Cheapest Palindrome
    POJ 3009 Curling 2.0
    POJ 3669 Meteor Shower
    POJ 2718 Smallest Difference
    POJ 3187 Backward Digit Sums
    POJ 3050 Hopscotch
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6492383.html
Copyright © 2011-2022 走看看