zoukankan      html  css  js  c++  java
  • bzoj3375[Usaco2004 Mar]Paranoid Cows 发疯的奶牛*

    bzoj3375[Usaco2004 Mar]Paranoid Cows 发疯的奶牛

    题意:

    依次给出n只奶牛的产奶时间段,求最大的k使得前k只奶牛不存在一个时间段被另一个时间段完全覆盖的情况。n≤100000。

    题解:

    设当前在处理第i只奶牛,前i-1只奶牛都合法。那么如果前i-1只奶牛中时间段左端点小于且最接近第i只奶牛时间段左端点的奶牛右端点大于当前奶牛则不合法,且如果前i-1只奶牛中时间段左端点大于且最接近第i只奶牛时间段左端点的奶牛右端点小于第i只奶牛则不合法,这是一个贪心的过程,可以用STLset维护。注意set要先插入一个+INF和负INF以防边界炸。

    代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <set>
     5 #define inc(i,j,k) for(int i=j;i<=k;i++)
     6 #define INF 0x3fffffff
     7 #define sit set<nd>::iterator
     8 using namespace std;
     9 
    10 inline int read(){
    11     char ch=getchar(); int f=1,x=0;
    12     while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    13     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    14     return f*x;
    15 }
    16 struct nd{int l,r; bool operator <(const nd&a)const{return l==a.l?r<a.r:l<a.l;}};
    17 set<nd>s; int n;
    18 int main(){
    19     n=read(); s.insert((nd){INF,0}); s.insert((nd){-INF,0});
    20     inc(i,1,n){
    21         int x=read(),y=read();
    22         s.insert((nd){x,y}); sit a=s.find((nd){x,y});
    23         sit b=--a; a++; sit c=++a; a--;
    24         if(b->r>=y&&b->l!=-INF){printf("%d",i-1); return 0;}
    25         if(c->r<=y&&c->l!=INF){printf("%d",i-1); return 0;}
    26     }
    27     printf("%d",n); return 0;
    28 }

    20160909

  • 相关阅读:
    lua中的冒号和点
    NuGet使用简要说明
    C#浅谈类实体与DataTable执行效率
    win8 使用技巧
    Bitnami Redmine 中文附件名 报错修复
    Markdown 测试
    几种常用网页返回顶部代码
    文字超出隐藏并显示省略号
    手机正则写法
    安卓内存管理相关关键字
  • 原文地址:https://www.cnblogs.com/YuanZiming/p/5876464.html
Copyright © 2011-2022 走看看