• CF76F Tourist


    调了半天,发现是没开long long

    Solution

    看这个题的时候,第一想法是按时间排序,然后朴素DP,但这样差不多是 (O(n^2cdot v)) 的。

    所以我们需要考虑更优的解法。

    不难发现,只有当 (i,j) 两点满足 (|x_i-x_j|leq |t_i-t_j| imes v) 时,才可以从一个点到另一个,然后我们尝试去转化这个式子。

    (t_ileq t_j) 时,如果 (x_ileq x_j)(x_j-x_ileq t_j imes v-t_i imes vRightarrow-x_i+t_i imes vleq -x_j+t_j imes v)

    ​ 否则 (x_i-x_jleq t_j imes v-t_i imes vRightarrow x_i+t_i imes vleq x_j+t_j imes v)

    (t_igeq t_j) 同理,那么我们设 (a_i=x_i+t_i imes v,b_i=-x_i+t_i imes v) ,可以将上面的式子变成 (a_ileq a_j,b_ileq b_j) ,也就是需要满足这两个条件就可以转移。

    然后将 (a) 排序,就是LIS问题。

    对于第一个问题,只要判断一下 (a_i,b_igeq 0) 就行了。、

    时间复杂度: (O(nlog n)) ,和普通的LIS问题一样。

    代码

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    
    using namespace std;
    const int N=1e5+10;
    const ll INF=1e12;
    struct node{
        ll a,b;
    }mt[N];
    ll q[N],x[N],t[N],v;
    int n,r,ans1,ans2;
    
    inline bool cmp(node a,node b){
        return a.a==b.a?a.b<b.b:a.a<b.a;
    }
    
    int find(int l,int r,ll x){
        int res=0;
        while(l<=r){
            int mid=(l+r)>>1;
            if(q[mid]>x) res=mid,r=mid-1;
            else l=mid+1;
        }
        return res;
    }
    
    int main(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lld%lld",&x[i],&t[i]);
        scanf("%lld",&v);
        for(int i=1;i<=n;i++){
            mt[i].a=-x[i]+t[i]*v;
            mt[i].b=x[i]+t[i]*v;
        }
        sort(mt+1,mt+1+n,cmp);
        q[0]=-INF,q[++r]=INF;
        for(int i=1;i<=n;i++){
            int pos=find(0,r,mt[i].b);
            if(q[pos]>mt[i].b) q[pos]=mt[i].b;
            if(pos>=r) q[++r]=INF;
        }
        ans2=r-1;
        q[r=1]=INF;
        for(int i=1;i<=n;i++)
            if(mt[i].a>=0&&mt[i].b>=0){
                int pos=find(0,r,mt[i].b);
                if(q[pos]>mt[i].b) q[pos]=mt[i].b;
                if(pos>=r) q[++r]=INF;
            }
        ans1=r-1;
        printf("%d %d
    ",ans1,ans2);
        return 0;
    }
    
  • 相关阅读:
    报错:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1
    Flink 集群安装配置
    配置Flink依赖的pom文件时报错:flink-clients_2.11 & flink-streaming-java_2.11
    解析流中的Xml文件时,报错:java.net.MalformedURLException: no protocol
    kafka产生的数据通过Flume存到HDFS中
    kafka服务自动关闭
    Flink安装启动
    hadoop长时间运行后,stop-all.sh报错
    Linux环境下配置maven环境
    vue2 自定义时间过滤器
  • 原文地址:https://www.cnblogs.com/jasony/p/13817573.html
Copyright © 2020-2023  润新知