AC日記——擠牛奶 洛穀 P1204

來源:互聯網
上載者:User

標籤:最大   change   第一個   space   lag   break   cst   i++   結束   

題目描述

三個農民每天清晨5點起床,然後去牛棚給3頭牛擠奶。第一個農民在300秒(從5點開始計時)給他的牛擠奶,一直到1000秒。第二個農民在700秒開始,在 1200秒結束。第三個農民在1500秒開始2100秒結束。期間最長的至少有一個農民在擠奶的連續時間為900秒(從300秒到1200秒),而最長的無人擠奶的連續時間(從擠奶開始一直到擠奶結束)為300秒(從1200秒到1500秒)。

你的任務是編一個程式,讀入一個有N個農民(1 <= N <= 5000)擠N頭牛的工作時間列表,計算以下兩點(均以秒為單位):

最長至少有一人在擠奶的時間段。

最長的無人擠奶的時間段。(從有人擠奶開始算起)

輸入輸出格式

輸入格式:

 

Line 1:

一個整數N。

Lines 2..N+1:

每行兩個小於1000000的非負整數,表示一個農民的開始時刻與結束時刻。

 

輸出格式:

 

一行,兩個整數,即題目所要求的兩個答案。

 

輸入輸出範例輸入範例#1:
3300 1000700 12001500 2100
輸出範例#1:
900 300
說明

題目翻譯來自NOCOW。

USACO Training Section 1.2

 

思路:

  離線做法

  線段樹把所有的區間都給覆蓋

  然後轉化成線性求最大區間

 

來,上代碼:

#include <cstdio>#include <string>#include <cstring>#include <iostream>using namespace std;class T_tree {    public:        int l,r,mid;                bool flag,dis;                void flag_()        {            flag=true;        }                void mid_()        {            mid=(l+r)>>1;        }                bool if_()        {            if(l==r) return true;            else return false;        }};class T_tree tree[1000001*4];int n,maxn,do_l[5001],do_r[5001],cnt=0;char Cget;bool result[1000001];inline void read_int(int &now_){    Cget=getchar();    while(Cget>‘9‘||Cget<‘0‘) Cget=getchar();    while(Cget<=‘9‘&&Cget>=‘0‘)    {        now_=now_*10+Cget-‘0‘;        Cget=getchar();    }}void tree_build(int now,int l,int r){    tree[now].l=l,tree[now].r=r;    if(l==r)    {        tree[now].dis=true;        return ;    }    tree[now].mid_();    tree_build(now<<1,l,tree[now].mid);    tree_build(now<<1|1,tree[now].mid+1,r);}inline void tree_down(int now){    if(tree[now].l==tree[now].r) return ;    tree[now<<1].flag_();    tree[now<<1].dis=false;    tree[now<<1|1].flag_();    tree[now<<1|1].dis=false;}void tree_change(int now,int l,int r){    if(tree[now].l==l&&tree[now].r==r)    {        tree[now].dis=false;        tree[now].flag_();        return ;    }    if(tree[now].flag) tree_down(now);    if(r<=tree[now].mid) tree_change(now<<1,l,r);    else if(l>tree[now].mid) tree_change(now<<1|1,l,r);    else    {        tree_change(now<<1,l,tree[now].mid);        tree_change(now<<1|1,tree[now].mid+1,r);    }}void tree_result(int now){    if(tree[now].if_())    {        result[++cnt]=tree[now].dis;        return ;    }    if(tree[now].flag) tree_down(now);    tree_result(now<<1);    tree_result(now<<1|1);}int main(){    read_int(n);    for(int i=1;i<=n;i++)    {        read_int(do_l[i]);        read_int(do_r[i]);        maxn=max(maxn,do_r[i]);    }    tree_build(1,1,maxn);    for(int i=1;i<=n;i++)    {        tree_change(1,do_l[i]+1,do_r[i]);    }    tree_result(1);    int max_t=0,max_f=0,max_tt;    for(int i=1;i<=cnt;i++)    {        if(!result[i])        {            max_tt=1;            for(int j=i+1;j<=cnt;j++)            {                if(result[j]==result[j-1]) max_tt++;                else                {                    if(result[j-1]) max_t=max(max_t,max_tt);                    else max_f=max(max_f,max_tt);                    max_tt=1;                }            }            if(result[cnt]) max_t=max(max_t,max_tt);            else max_f=max(max_f,max_tt);            break;        }    }    printf("%d %d\n",max_f,max_t);    return 0;}

 

AC日記——擠牛奶 洛穀 P1204

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.