【USACO】奶牛跑步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

pre.cjk { font-family: "Droid Sans Fallback", monospace }
p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }

因为数据所给的起点是升序的,所以可以推出:
当s2+t*v2<=s1+t*v1时,2和1不能在同一跑道。
所以就可以把每个点的s+v*t算出来,从后往前扫,先查询有没有比这个数大的数,若没有则答案+1,否则要删去比这个数大的一个数,注意是一个数,我一开始把它们全删了导致WA飞。
然后问题是要删哪一个数,贪心地想想,肯定是删最小的那个最优,这样就可以保证大的数可以被另外的数删。
  1 #include<set>
  2 #include<map>
  3 #include<queue>
  4 #include<stack>
  5 #include<ctime>
  6 #include<cmath>
  7 #include<string>
  8 #include<vector>
  9 #include<cstdio>
 10 #include<cstdlib>
 11 #include<cstring>
 12 #include<iostream>
 13 #include<algorithm>
 14 #define maxn 100010
 15 #define LL long long
 16 #define inf 999999999999999995ll
 17 using namespace std;
 18 int ch[maxn][2],pre[maxn],size[maxn],root=0,tot=0;
 19 LL ANS=0,key[maxn],in[maxn];
 20 void updata(int x){
 21   size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
 22 }
 23 void Rotate(int x,int kind){
 24   int y=pre[x];
 25   ch[y][!kind]=ch[x][kind];
 26   pre[ch[x][kind]]=y;
 27   if(pre[y])
 28     ch[pre[y]][ch[pre[y]][1]==y]=x;
 29   pre[x]=pre[y];
 30   ch[x][kind]=y;
 31   pre[y]=x;
 32   updata(y);
 33   updata(x);
 34 }
 35 void Splay(int r,int goal){
 36   while(pre[r]!=goal){
 37     if(pre[pre[r]]==goal)
 38       Rotate(r,ch[pre[r]][0]==r);
 39     else{
 40       int y=pre[r];
 41       int kind=ch[pre[y]][0]==y;
 42       if(ch[y][kind]==r){
 43     Rotate(r,!kind);
 44     Rotate(r,kind);
 45       }
 46       else{
 47     Rotate(y,kind);
 48     Rotate(r,kind);
 49       }
 50     }
 51   }
 52   if(goal==0) root=r;
 53 }
 54 void newnode(int &x,int fa,LL keyy){
 55   x=++tot;
 56   pre[x]=fa;
 57   ch[x][0]=ch[x][1]=0;
 58   key[x]=keyy;
 59   size[x]=1;
 60 }
 61 void Insert(LL k){
 62   while(ch[root][key[root]<k])
 63     size[root]++,root=ch[root][key[root]<k];
 64   size[root]++;
 65   newnode(ch[root][key[root]<k],root,k);
 66   Splay(ch[root][key[root]<k],0);
 67 }
 68 void get_nex(int x,LL k,int &ans){
 69   if(!x) return;
 70   if(key[x]<=k) ans=x,get_nex(ch[x][1],k,ans);
 71   if(key[x]>k) get_nex(ch[x][0],k,ans);
 72 }
 73 void erase(int x){
 74   int nexx=ch[x][1];
 75   while(ch[nexx][0]) nexx=ch[nexx][0];
 76   Splay(nexx,0);
 77   if(!ch[nexx][1]) pre[ch[nexx][0]]=0,root=ch[nexx][0];
 78   else{
 79     pre[ch[nexx][1]]=0;
 80     int rt=ch[nexx][1];
 81     while(ch[rt][0]) rt=ch[rt][0];
 82     pre[ch[nexx][0]]=rt;
 83     ch[rt][0]=ch[nexx][0];
 84   }
 85 }
 86 void solve(LL k){
 87   int nex1=root;get_nex(root,k,nex1);
 88   Splay(nex1,0);
 89   if(!size[ch[nex1][1]])
 90     ANS++;
 91   else erase(nex1);
 92   updata(nex1);
 93 }
 94 int main()
 95 {
 96   freopen("!.in","r",stdin);
 97   freopen("!.out","w",stdout);
 98   int n;
 99   LL v,t;
100   scanf("%d%lld",&n,&t);
101   for(int i=1;i<=n;i++)
102     scanf("%lld%lld",&in[i],&v),in[i]+=v*t;
103   newnode(root,0,-inf);
104   for(int i=n;i>=1;i--){
105     solve(in[i]);
106     Insert(in[i]);
107   }
108   printf("%lld\n",ANS);
109   return 0;
110 }

 
时间: 2024-08-27 21:38:31

【USACO】奶牛跑步2的相关文章

奶牛跑步2

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

[USACO]奶牛会展(背包)

[USACO]奶牛会展 题目背景 奶牛想证明它们是聪明而风趣的.为此,贝西筹备了一个奶牛博览会,她已经对N 头奶牛进行 了面试,确定了每头奶牛的智商和情商. 题目描述 贝西有权选择让哪些奶牛参加展览.由于负的智商或情商会造成负面效果,所以贝西不希望出展奶牛的智商之和小于零,或情商之和小于零.满足这两个条件下,她希望出展奶牛的智商与情商之和越大越好,请帮助贝西求出这个最大值. 输入输出格式 输入格式: ? 第一行:单个整数N,1 ≤ N ≤ 400 ? 第二行到第N + 1 行:第i + 1 行有

USACO 奶牛食品(网络流)

题目大意: FJ的奶牛们只吃各自喜欢的一些特定的食物和饮料,除此之外的其他食物和饮料一概不吃.某天FJ为奶牛们精心准备了一顿美妙的饭食,但在之前忘记检查奶牛们的菜单,这样显然是不能不能满足所有奶牛的要求.但是FJ又不愿意为此重新来做,所以他他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. FJ提供了F (编号为1.2.-.F)种食品并准备了D (编号为1.2.-.D)种饮料, 他的N头牛(编号为1.2.-.N)都已决定了是否愿意吃某种食物和喝某种饮料.FJ想给每一头牛一种食品和一种饮料,使得尽可

cogs 1945. 奶牛跑步

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

BZOJ 1666 Usaco 奶牛的数字游戏

1 #include <cstdio> 2 #include <algorithm> 3   4 int n; 5 int tot; 6   7 int main(){ 8     scanf("%d",&n); 9     while(n!=1){ 10         if(n%2!=0){ 11             n=n*3+1; 12             tot++; 13         } 14         else if(n%

USACO 奶牛排队

题目:给出一个只含有1,2,3的数字序列,问最少交换多少次才能将之变为递增数列. 解: 注意到只有1,2,3,我们只要将1,3交换到自己的应在位置上那么排序就已经完成了. 需要交换的有几种,记$a(x,,y)$表示x在应该是y的位置上的$a(i)$的个数,那么我们优先交换a(1,3)和a(3,1)里的数字,一次交换扳正两个位置,接下来要想扳正一个1或3的位置就必须要进行一次交换操作. 统计计算即可. 1 #include <iostream> 2 #include <cstdio>

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 比较方

1861 奶牛的数字游戏 2006年USACO

codevs——1861 奶牛的数字游戏 2006年USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 奶牛们又在玩一种无聊的数字游戏.输得很郁闷的贝茜想请你写个程序来帮她在开局时预测结果.在游戏的开始,每头牛都会得到一个数N(1<=N<=1,000,000).此时奶牛们的分数均为0.如果N是奇数,那么奶牛就会把它乘以3后再加1.如果N是偶数,那么这个数就会被除以2.数字每变动一次,这头奶牛就得到1分.当N的

SPFA cojs 176. [USACO Feb07] 奶牛聚会

cojs 176. [USACO Feb07] 奶牛聚会 ★☆   输入文件:sparty.in   输出文件:sparty.out   简单对比时间限制:3 s   内存限制:16 MB N(1 ≤ N ≤ 1000)个农场中的每个农场都有一只奶牛去参加位于第X个农场的聚会.共有M (1 ≤ M ≤ 100,000)条单向的道路,每条道路连接一对农场.通过道路i会花费Ti (1 ≤ Ti ≤ 100)的时间. 作为参加聚会的奶牛必须走到聚会的所在地(农场X).当聚会结束时,还要返回各自的农场.