zoukankan      html  css  js  c++  java
  • (寒假集训) Cow Jog(二分优化的最长上升子数列)

    Cow Jog

    时间限制: 1 Sec  内存限制: 64 MB
    提交: 24  解决: 5
    [提交][状态][讨论版]

    题目描述

    Farmer John's N cows (1 <= N <= 100,000) are out exercising their hooves again, jogging along an infinite track.  Each cow starts at a distinct position on the track, and some cows run at different speeds.

    The track is divided into lanes so that cows may move past each other. No two cows in the same lane may ever occupy the same position. Farmer John doesn't want any cow to have to change lanes or adjust speed, and he wonders how many lanes he will need to accomplish this if the cows are going to run for T minutes (1 <= T <= 1,000,000,000).

    输入


    The first line of input contains N and T.

    The following N lines each contain the initial position and speed of a single cow.  Position is a nonnegative integer and speed is a positive integer; both numbers are at most 1 billion.  All cows start at distinct positions, and these will be given in increasing order in the input.

    输出

    A single integer indicating the minimum number of lanes necessary so that no two cows in the same lane ever occupy the same location (including at time T).

    样例输入

    5 3
    0 1
    1 2
    2 3
    3 2
    6 1
    

    样例输出

    3
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #define inf 2e9
    #define met(a,b) memset(a,b,sizeof a)
    typedef long long ll;
    using namespace std;
    const int N = 1e5+5;
    const int M = 4e5+5;
    ll m,t,v;
    int cnt=0,n;
    ll a[N],d[N],j,len;
    int  LIS(ll *arr, int n){
        ll *dp=new ll [n+5];
        int  where, idx = 1;
        dp[idx] = arr[0];
        for (int i = 1; i < n; ++i){
            if (arr[i]>=dp[idx]){
                idx++;
                dp[idx] = arr[i];
            }
            else{
                where = upper_bound(dp+1, dp + idx+1, arr[i]) - dp;//非下降
                dp[where] = min(dp[where], arr[i]);
            }
        }
        delete[] dp;
        return idx;
    }
     
    int main() {
        scanf("%d%lld",&n,&t);
        for (int i = 1; i <=n; ++i) {
            scanf("%lld%lld",&m,&v);
            a[i]=m+t*v;
        }
        for(int i=n;i>0;i--){
            d[cnt++]=a[i];
        }
        printf ("%d
    ", LIS(d,n));
        return 0;
    }
  • 相关阅读:
    【Java】+Lombok
    【Java】【陷阱】toString() 再也不用了
    【Excel】获取一列的有效行数
    【Excel】同一个表格 不同sheet表之间数据关联
    【Excel】+ 高亮显示当前单元格所在的行与列
    【Java】获取类中所有的方法
    捕获子线程中的异常
    Kafka documentation PDF
    Spring java8 LocalDatetime 格式化
    OneDrive同步文件夹不显示绿色对勾
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/6270661.html
Copyright © 2011-2022 走看看