https://www.luogu.org/problem/show?pid=1204

题目描述

三个农民每天清晨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:

3
300 1000
700 1200
1500 2100
输出样例#1:

900 300

说明

题目翻译来自NOCOW。

USACO Training Section 1.2

时间区间我用的左闭右开、

线段树区间修改,最后统计最大值、

 #include <cstdio>

 #define max(a,b) (a>b?a:b)

 const int N();
int n,cnt,l[N],r[N],have[N];
struct Tree {
bool flag;
int l,r,val;
}tr[N<<]; #define lc (now<<1)
#define rc (now<<1|1)
#define mid (tr[now].l+tr[now].r>>1)
void Tree_build(int now,int l,int r)
{
tr[now].l=l; tr[now].r=r;
if(l==r)
{
tr[now].val=;
tr[now].flag=;
return ;
}
Tree_build(lc,l,mid);
Tree_build(rc,mid+,r);
}
void Tree_down(int now)
{
if(tr[now].l==tr[now].r) return ;
tr[lc].flag=; tr[lc].val=;
tr[rc].flag=; tr[rc].val=;
}
void Tree_add(int now,int l,int r)
{
if(tr[now].l==l&&tr[now].r==r)
{
tr[now].val=;
tr[now].flag=;
return ;
}
if(tr[now].flag) Tree_down(now);
if(r<=mid) Tree_add(lc,l,r);
else if(l>mid) Tree_add(rc,l,r);
else Tree_add(lc,l,mid),Tree_add(rc,mid+,r);
}
void Tree_push(int now)
{
if(tr[now].l==tr[now].r)
{
have[++cnt]=tr[now].val;
return ;
}
if(tr[now].flag) Tree_down(now);
Tree_push(lc); Tree_push(rc);
} inline void read(int &x)
{
x=; register char ch=getchar();
for(;ch>''||ch<'';) ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-'';
} int AC()
{
int R=; read(n);
for(int i=; i<=n; ++i)
{
read(l[i]);read(r[i]);
R=max(R,r[i]);
}
Tree_build(,,R);
for(int i=; i<=n; ++i)
Tree_add(,l[i]+,r[i]);
Tree_push();
int ans1=,ans2=,tmp;
for(int i=; i<=cnt; ++i)
{
if(have[i]) continue;
tmp=;
for(int j=i+; j<=cnt; j++)
{
if(have[j]==have[j-]) tmp++;
else
{
if(have[j-]) ans2=max(ans2,tmp);
else ans1=max(ans1,tmp);
tmp=;
}
}
if(have[cnt]) ans2=max(ans2,tmp);
else ans1=max(ans1,tmp);
break;
}
printf("%d %d\n",ans1,ans2);
return ;
} int Hope=AC();
int main(){;}

最新文章

  1. 别再迷信 zepto 了
  2. WCF 4.0 进阶系列 -- 随笔汇总
  3. eclipse项目编码问题
  4. 1-1 Windows应用程序的特点
  5. PL/pgSQL学习笔记之四
  6. dispatch_async &amp; dispatch_sync
  7. 跟我学solr---吐槽一下,我的文章被抄袭啦
  8. C++学习之指针的常见错误
  9. ASP.NET、HTML+CSS - 弹出提示窗体
  10. icon 图标下载
  11. 9.Spark Streaming
  12. Webpack 4教程:为什么要优化代码
  13. 事件&amp;表达式
  14. windows php exec()不生效问题
  15. iptables转发技术
  16. DJango 基础 (1)
  17. centos7 编译安装nginx+tcp转发
  18. 【洛谷P3792】由乃与大母神原型和偶像崇拜
  19. 关于spark的mllib学习总结(Java版)
  20. PHP使用UTF8编码读取ACCESS的乱码问题解决方案(转)

热门文章

  1. OLR文件丢失的恢复
  2. POJ 1679 The Unique MST(推断最小生成树_Kruskal)
  3. python为在线漫画站点自制非官方API(未完待续)
  4. element-UI中table表格的row-click事件怎么获取一行数据的id
  5. bzoj1081: [SCOI2005]超级格雷码(dfs)
  6. Linux - shell壳脚本
  7. Local Response Normalization作用——对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力
  8. poj--3624--Charm Bracelet(动态规划 水题)
  9. package-org.springframework.ui-interface:Model.class
  10. 使用Aliyun Docker 容器镜像/注册表服务