zoukankan      html  css  js  c++  java
  • Atcoder | AT2665 【Moderate Differences】

    又是一道思路特别清奇的题qwq...(瞪了一上午才发现O(1)的结论...差点还想用O(n)解决)
    问题可以转化为是否能够由(f_{1}=a)通过(pm x in[c,d])得到(f_{n}=b),于是考虑用数学方法解决
    证明比较简单...就是...能想到这一点就很毒瘤了qwq...让我来随手拿一个样例举例qwq

    输入样例2:4 7 6 4 5
    输出样例2:NO
    

    丝毫不想画图...太乱惹qwq
    为了能看的更明白我还是画吧qwq(感谢GeoGebra)
    注:横坐标表示框内数值,纵坐标表示编号(宽屏没办法qwq...看不清就保存图片放大...还是能看清楚一点的...实在不行下面会放坐标)
    下面的图片可以在新的标签页中打开放大...经测试清晰度可以接受

    做出上图后发现,绿色线段对应位置是可以到达的,此时问题转化为点(B)是否在某一条绿色线段(含端点)上
    取所有线段中点后发现,在纵坐标为奇数时,所有线段中点到点(A)的横坐标距离为(2k imes frac{c+d}{2}(k in N)),在纵坐标为奇数时,所有线段中点到A的横坐标距离为((2k+1) imes frac{c+d}{2}(k in N)),位于(y=k)上的最远的线段中点到点(A)的横坐标距离为((k-1) imes frac{c+d}{2}),且长度为((k-1) imes (d-c)),也即点(B)与点(A)的横坐标距离(leq (n-1) imes frac{c+d}{2})且与位于(y=n)上某条线段的中点距离(leq frac{(n-1) imes (d-c)}{2})时由(A)可以到达(B),所以只需要按照(n)的奇偶性分类(O(1))计算结果即可.
    全都是数学推导...感性理解一下就好
    下面放代码$downarrow downarrow downarrow $

    #include<cstdio>//AT2665
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<algorithm>
    #include<cstdlib>
    
    using namespace std;
    
    int n,a,b,c,d,delta,whole;
    
    double nxt,half=0.5,maxhalf,lft;
    
    int main(){
        scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);
        nxt+=c+d;
        nxt/=2;
        half=nxt-c;
        maxhalf=half*(n-1);
        delta=abs(a-b);
        if(delta>(n-1)*nxt+maxhalf){//超过最远距离
            printf("NO
    ");
            return 0;
        }
        whole=(int)(delta/nxt);
        lft=delta-nxt*whole;
        if(n&1){//n%2==1
            if(whole&1){
                lft=nxt-lft;
                if(lft<=maxhalf){
                    printf("YES
    ");
                    return 0;
                }
                else{
                    printf("NO
    ");
                    return 0;
                }
            }
            else{
                if(lft<=maxhalf){
                    printf("YES
    ");
                    return 0;
                }
                else{
                    printf("NO
    ");
                    return 0;
                }
            }
        }
        else{//n%2==0
            if(whole&1){
                if(lft<=maxhalf){
                    printf("YES
    ");
                    return 0;
                }
                else{
                    printf("NO
    ");
                    return 0;
                }
            }
            else{
                lft=nxt-lft;
                if(lft<=maxhalf){
                    printf("YES
    ");
                    return 0;
                }
                else{
                    printf("NO
    ");
                    return 0;
                }
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    Redis系列二 Redis数据库介绍
    Redis系列一 Redis安装
    SpringData系列四 @Query注解及@Modifying注解
    SpringData系列三 Repository Bean 方法定义规范
    SpringData系列二 Repository接口
    SpringData系列一 Spring Data的环境搭建
    ThinkPHP3.1.3 Fast & Simple OOP PHP Framework 显示错误
    STL学习系列之一——标准模板库STL介绍
    STL之二:vector容器用法详解
    STL使用总结
  • 原文地址:https://www.cnblogs.com/--BLUESKY007/p/9482023.html
Copyright © 2011-2022 走看看