奶牛跑步2

P1443 - USACO】奶牛跑步2

Description

FJ的N(1 <= N <= 100,000)头奶牛们又兴高采烈地出来运动了!她们在一条无限长的小路上跑步,每头牛起跑的位置都不同,速度也不尽相同。

道路中划出了若干条跑道,以便她们能快速"超车",同一跑道中的任意两头牛都不会出现在相同的位置。不过FJ不愿让任何一头牛更换跑道或者调整速度,他想知道如果让牛们跑足T(1 <= T <=
1,000,000,000)分钟的话,至少需要多少条跑道才能满足需要。

Input

第一行有两个数,N和T;

接下来有N行,每一行两个数,表示一头牛的位置和速度,其中位置是一个非负整数,速度为一个正整数,均不超过10^9。所有牛的开始位置均不相同,因此N头牛的数据将以位置升序的方式给出。

Output

输出为一个整数,表示所需跑道的最小数目,要保证同一跑道中的任意两头牛在T时限内(到第T分钟结束)不会撞到一起。

Sample Input

5 3

0 1

1 2

2 3

3 2

6 1

Sample Output

3

Hint

Source

USACO

基本 ,平衡树

首先得到一个式子,xi+vi*T < xj+vj*T,若j与i满足这个条件,则j可以放在i后面,与i用一个跑道,意思是i无论如何都无法再T时间内追上j。但有很多个点满足,因为把j放入跑道之后,这条跑道的条件就要用j的信息来判断了,所以要使损失最小,则应该把j放到所有满足条件的值最大的那个后面,所以此时应该贪心一个一个的加入,用平衡树来实现查找,然后删除这个前驱,加入这个点。若没有前驱则表示没有满足条件的,需增加一个跑道,此时ans++;

  1 #include<map>
  2 #include<set>
  3 #include<cmath>
  4 #include<ctime>
  5 #include<queue>
  6 #include<stack>
  7 #include<cstdio>
  8 #include<vector>
  9 #include<cstdlib>
 10 #include<cstring>
 11 #include<iomanip>
 12 #include<iostream>
 13 #include<algorithm>
 14 #define ll long long
 15 #define rep(i,a,b) for(register int i=a;i<=b;i++)
 16 #define re register
 17 #define il inline
 18 using namespace std;
 19 const int N=100010;
 20 int pre[N],cnt[N],ch[N][2],n,root,tot;
 21 ll key[N],T;
 22 il ll gl() {
 23     ll ret=0;char ch=getchar();
 24     while(ch<‘0‘||ch>‘9‘) ch=getchar();
 25     while(ch>=‘0‘&&ch<=‘9‘) ret=ret*10+ch-‘0‘,ch=getchar();
 26     return ret;
 27 }
 28 il int getx(int x) {return ch[pre[x]][1] == x;}
 29 il void Newnode(int fa,ll v) {
 30     ++tot;
 31     pre[tot]=fa , cnt[tot]=1;
 32     key[tot]=v;
 33 }
 34 il void Rotate(int x) {
 35     int old=pre[x],oldx=pre[old],bj=getx(x);
 36     ch[old][bj]=ch[x][!bj];pre[ch[old][bj]]=old;
 37     ch[x][!bj]=old;pre[old]=x;
 38     pre[x]=oldx;
 39      if(oldx) ch[oldx][ch[oldx][1]==old]=x;
 40 }
 41 il void Splay(int x,int goal) {
 42     while(pre[x]!=goal) {
 43         if(pre[pre[x]]==goal) Rotate(x);
 44         else {
 45             int no=getx(x),od=getx(pre[x]);
 46             if(no==od) Rotate(pre[x]),Rotate(x);
 47             else Rotate(x),Rotate(x);
 48         }
 49     }
 50     if(goal==0) root=x;// bug
 51 }
 52 il void Insert(ll v) {
 53     if(root==0) {
 54         Newnode(0,v);root=tot;return;
 55     }
 56     int now=root,fa=0;
 57     while(1) {
 58         if(key[now]==v) {
 59             cnt[now]++;Splay(now,0);return;
 60         }
 61         fa=now;
 62         now=ch[now][v > key[now]];
 63         if(now==0) {
 64             Newnode(fa,v);
 65             ch[fa][v > key[fa]] = tot;
 66             Splay(tot,0);
 67             return;
 68         }
 69     }
 70 }
 71 il int get_pre() {
 72     int now=ch[root][0];
 73     while(ch[now][1]) now=ch[now][1];
 74     return now;
 75 }
 76 il void del(int x) {
 77     if(root==0) return;
 78     Splay(x,0);
 79     if(cnt[x]>1) {cnt[x]--;return;}
 80     if(!ch[x][0]&&!ch[x][1]) {
 81         root=0;return;
 82     }
 83     if(!ch[x][0]) {
 84         root=ch[x][1];pre[root]=0;
 85         return;
 86     }
 87     else if(!ch[x][1]) {
 88         root=ch[x][0];pre[root]=0;
 89         return;
 90     }
 91     int l=get_pre();
 92     Splay(l,0);//
 93     ch[root][1]=ch[x][1];
 94     pre[ch[x][1]]=root;// bug
 95     ch[x][1]=ch[x][0]=cnt[x]=0;//
 96     return;
 97 }
 98 int find(ll k) {//  找到 <= k 的最大数
 99     int ret=-1,now=root;
100     while(now) {
101         if(key[now] < k) ret=now,now=ch[now][1];
102         else now=ch[now][0];
103     }
104     return ret;
105 }
106 int main() {
107     scanf("%d",&n);T=gl();
108     re ll x,v,S;
109     int ans=0;
110     rep(i,1,n) {
111         x=gl(),v=gl(),S=x+v*T;
112         int cur=find(S);
113         if(cur==-1) ans++;
114         else del(cur);
115         Insert(S);
116     }
117     cout<<ans;
118     return 0;
119 }
时间: 2024-10-26 19:16:40

奶牛跑步2的相关文章

【USACO】奶牛跑步2

P1443 - [USACO]奶牛跑步2 Description FJ的N(1 <= N <= 100,000)头奶牛们又兴高采烈地出来运动了!她们在一条无限长的小路上跑步,每头牛起跑的位置都不同,速度也不尽相同. 道路中划出了若干条跑道,以便她们能快速"超车",同一跑道中的任意两头牛都不会出现在相同的位置.不过FJ不愿让任何一头牛更换跑道或者调整速度,他想 知道如果让牛们跑足T(1 <= T <= 1,000,000,000)分钟的话,至少需要多少条跑道才能满

cogs 1945. 奶牛跑步

★   输入文件:cowjoga.in   输出文件:cowjoga.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 奶牛们又兴高采烈地出去运动了!一共有N(1 <= N <= 100,000)头牛在一条无限长的单向羊肠小道上慢跑.每头牛在小道上的起点都不同,牛儿们的速度也不尽相同. 这条羊肠小道太窄了,奶牛们没办法"超车",如果一头快速牛追上了前边的慢速牛,她就必须减速,从而融入这些慢速牛集团中,变成跟前面的牛一样的速度. 牛儿们一共要跑

USACO翻译:USACO 2012 JAN三题(2)

USACO 2012 JAN(题目二) 一.题目概览 中文题目名称 叠干草 分干草 奶牛跑步 英文题目名称 stacking baleshare cowrun 可执行文件名 stacking baleshare cowrun 输入文件名 stacking.in baleshare.in cowrun.in 输出文件名 stacking.out baleshare.out cowrun.out 每个测试点时限 1秒 1秒 1秒 测试点数目 10 10 10 每个测试点分值 10 10 10 比较方

TYVJ P1023 奶牛的锻炼 Label:dp

背景 USACO 描述 奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息.若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加1(初始为0).若她在第i分钟休息,则疲倦程度减少1.无论何时,疲倦程度都不能超过M.另外,一旦她开始休息,只有当疲惫程度减为0时才能重新开始跑步.在第N分钟后,她的疲倦程度必须为0. 输入格式 第一行,两个整数,代表N和M.接下来N行,每行一个整数,代表D_i. 输出格式 Bessie想知道,她最多能跑的距离. 测试样例1 输入 5 2 5 3 4 2 10

【BZOJ】【1046】/【POJ】【3613】【USACO 2007 Nov】Cow Relays 奶牛接力跑

倍增+Floyd 题解:http://www.cnblogs.com/lmnx/archive/2012/05/03/2481217.html 神题啊= =Floyd真是博大精深…… 题目大意为求S到E,恰好经过N条边的最短路径(姑且称为路径吧,虽然好像已经不是了……) 总共只有大约200个点(很多点根本没走到,离散化一下即可)所以可以考虑Floyd算最短路. 引用下题解: 题目求i,j之间边数恰为N的最短路径(边可以重复走),我们知道线性代数中有:01邻接矩阵A的K次方C=A^K,C[i][j

矩阵乘法专题2——bzoj 1706 [usaco2007 Nov] relays 奶牛接力跑 题解

转载请注明:http://blog.csdn.net/jiangshibiao/article/details/24960651 [原题] 1706: [usaco2007 Nov]relays 奶牛接力跑 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 340  Solved: 162 [Submit][Status] Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力

luogu P1353 [USACO08JAN]跑步Running

题目描述 The cows are trying to become better athletes, so Bessie is running on a track for exactly N (1 ≤ N ≤ 10,000) minutes. During each minute, she can choose to either run or rest for the whole minute. The ultimate distance Bessie runs, though, depe

P1353 [USACO08JAN]跑步Running

P1353 [USACO08JAN]跑步Running 题目描述 The cows are trying to become better athletes, so Bessie is running on a track for exactly N (1 ≤ N ≤ 10,000) minutes. During each minute, she can choose to either run or rest for the whole minute. The ultimate distan

[BZOJ] 1706: [usaco2007 Nov]relays 奶牛接力跑

1706: [usaco2007 Nov]relays 奶牛接力跑 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 707  Solved: 367[Submit][Status][Discuss] Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项目.至于进行接力跑的地点 自然是在牧场中现有的T(2 <= T <= 100)条跑道上. 农场上的跑道有一些交汇点,每条跑道都连结