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

时间: 2024-08-27 19:09:50

bzoj3375[Usaco2004 Mar]Paranoid Cows 发疯的奶牛*的相关文章

3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二

3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved: 18[Submit][Status][Discuss] Description 洞窟里有一道长长的通道.它由N(1≤N≤25000)段道尾相连构成,编号分别为1到N.每个通道有一个阈值,其范围在[1,10^9]依次通过i..j的通道,那奶牛的体重指数就不能超过i..j通道中阈值的最小值.贝茜有Q

Bzoj 3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一

3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 64  Solved: 37[Submit][Status][Discuss] Description 很少人知道其实奶牛非常喜欢到洞穴里面去探险. 洞窟里有N(1≤N≤100)个洞室,由M(1≤M≤1000)条双向通道连接着它们.每对洞室间 至多只有一条双向通道.有K(1≤K≤14)个洞室,里面放有1捆干草.牛吃1捆

bzoj 3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜

3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜 Description 兽群中总是有一些麻烦制造者.约翰知道他的N(1≤N≤100)头奶牛中有一头总是说谎,其他的总是说真话.他想快速的找出这个麻烦制造者.为了实现这个目标,他一个一个的问这些奶牛Q(1≤Q≤1000)个关于它们吃草的简单问题(虽然大多数奶牛是诚实的但它们依旧很笨只能懂得一些关于食物的话题). 他将这些问题用以下的格式写了下来: 牛4说:牛5比牛10吃得多 牛6说:牛10比牛7吃得多 牛3说:牛

BZOJ 3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜( 差分约束 )

枚举每头牛, 假设它在说谎, 建图判圈就行了...为啥水题都没人来写.. ------------------------------------------------------------------ #include<bits/stdc++.h> using namespace std; typedef pair<int, int> pii; const int maxn = 109; struct edge { int to, w; edge(int _t, int _w

BZOJ 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛( dp )

一道水 dp ...然后我一开始用 BFS ...结果 MLE 了... dp[ i ][ j ][ k ] 由它四个方向上的 k - 1 转移. ----------------------------------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> #include<

BZOJ1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛

1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 665  Solved: 419[Submit][Status] Description Farmer John养了N(1 <= N <= 5,000)头奶牛,每头牛都有一个不超过32位二进制数的正整数编号.FJ希望奶牛们在进食前,能按编号从小到大的顺序排好队,但奶牛们从不听他的话.为了让奶牛们养成这个习惯,每次开饭时,FJ从奶

bzoj3380[Usaco2004 Open]Cave Cows 1 洞穴里的牛之一*

bzoj3380[Usaco2004 Open]Cave Cows 1 洞穴里的牛之一 题意: 给一个无向图,每一条边都有一个阈值,有一些点有草.牛从点1出发,每当它到达有草的点可以选择吃或不吃,如果吃的话体重加1.对于边如果它的阈值小于牛的体重,则此边不可通过.求牛走一圈回到点1的最大体重.有草节点数≤14.点数≤100,边数≤1000. 题解: f[i][S]表示当前点为i,草状态为S的状态能否达到.具体看代码. 代码: 1 #include <cstdio> 2 #include <

bzoj3374[Usaco2004 Mar]Special Serial Numbers 特殊编号*

bzoj3374[Usaco2004 Mar]Special Serial Numbers 特殊编号 题意: 求比一个数大的最小的一半以上的数位相同的数.数位数≤100. 题解: 模拟题.从低位枚举到高位,对于每一位枚举比原数该位大的数,同时枚举这一位之后要由0和哪一个数组成,最后得到一个最小的数输出.具体看代码. 有点像NOIP的那道Jam的计数法. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algor

bzoj3382[Usaco2004 Open]Cave Cows 3 洞穴里的牛之三*

bzoj3382[Usaco2004 Open]Cave Cows 3 洞穴里的牛之三 题意: n个点,求最远曼哈顿距离.n≤50000. 题解: 曼哈顿距离转切比雪夫距离(点(x,y)变为点(x+y,x-y)),然后输出最大横坐标-最小横坐标与最大纵坐标-最小纵坐标的较大值即可. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(in