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;
    }
  • 相关阅读:
    MongoDB Query 常用方法
    plsql中文乱码问题(显示问号)
    xtype的使用
    LinQ:list基础操作
    VMware Fusion自动切换分辨率
    C#截取字符串的方法小结
    HTML 编码
    AMQP(Advanced Message Queuing Protocol)
    rabibtMQ安装及集群配置linux
    今天是个开始
  • 原文地址:https://www.cnblogs.com/IUUUUUUUskyyy/p/6492383.html
Copyright © 2011-2022 走看看