zoukankan      html  css  js  c++  java
  • hdu 5626 Clarke and points 数学推理

    Clarke and points

    Problem Description
     
    The Manhattan Distance between point A(XA,YA) and B(XB,YB) is |XA - XB| + |Xb - YB|;
    the coordinate of each point is generated by the followed code.
    Input

    long long seed;
    inline long long rand(long long l, long long r) {
      static long long mo=1e9+7, g=78125;
      return l+((seed*=g)%=mo)%(r-l+1);
    }

    cin >> n >> seed;
    for (int i = 0; i < n; i++)
      x[i] = rand(-1000000000, 1000000000),
      y[i] = rand(-1000000000, 1000000000);
     
    Output
    For each test case, print a line with an integer represented the maximum distance.
     
    Sample Input
    2
    3 233
    5 332
     
    Sample Output
    1557439953
    1423870062

     
    这道题原本不难但值得分析;开始一直在纠结两个变量之间的大小关系;因为这关系到去绝对值之后是否要变号的问题;但是还是看了题解。。。
    题解:对于二维的变量,由于加了绝对值,则只有两种关系,要不就两个数要都大,这样ans = (Xi+Yi) - (Xj + Yj);同时注意到此时的| (Xi - Yi) - (Xj - Yj) | < | ans |;(两个正数相加肯定大于相减(加了绝对值也是一样),这时就算 计算了另一个对结果也没影响,后面亦同);若是一大一小,那么ans = (Xi - Yi) - (Xj - Yj);此时满足 |ans| > | (Xi+Yi) - (Xj + Yj) |;
    这时能说ans就是取max( | (Xi+Yi) - (Xj + Yj) |,| (Xi - Yi) - (Xj - Yj) | );即维护最大最小的x+y与x - y;
     
    ps:在线算法,节省空间;
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string.h>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<vector>
    #include<cmath>
    #include<stdlib.h>
    #include<time.h>
    #include<stack>
    #include<set>
    using namespace std;
    #define rep0(i,l,r) for(int i = (l);i < (r);i++)
    #define rep1(i,l,r) for(int i = (l);i <= (r);i++)
    #define rep_0(i,r,l) for(int i = (r);i > (l);i--)
    #define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
    #define MS0(a) memset(a,0,sizeof(a))
    #define MS1(a) memset(a,-1,sizeof(a))
    typedef __int64 ll;
    template<typename T>
    void read1(T &m)
    {
        T x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        m = x*f;
    }
    template<typename T>
    void read2(T &a,T &b){read1(a);read1(b);}
    template<typename T>
    void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);}
    template<typename T>
    void out(T a)
    {
        if(a>9) out(a/10);
        putchar(a%10+'0');
    }
    ll n,seed;
    inline ll rand(ll l, ll r) {
        static ll mo=1e9+7, g=78125;
        return l+((seed*=g)%=mo)%(r-l+1);
    }
    const ll inf = 0x3f3f3f3f3f3f3f3fLL;
    int main()
    {
        int T;
        read1(T);
        while(T--){
            read2(n,seed);
            ll mn0 = inf,mn1 = -inf,mx0 = inf,mx1 = -inf,x,y,ans;
            rep0(i,0,n){
                x = rand(-1000000000, 1000000000);
                y = rand(-1000000000, 1000000000);
                ll tmp = x + y,temp = x - y;
                mn0 = min(mn0,tmp);mn1 = max(mn1,tmp);
                mx0 = min(mx0,temp);mx1 = max(mx1,temp);
            }
            ans = max(mn1 - mn0,mx1 - mx0);
            out(ans);puts("");
        }
        return 0;
    }
    View Code
     
  • 相关阅读:
    idea中导入jquery无法生效解决办法
    如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的?
    spring的ioc依赖注入的三种方法(xml方式)
    向存在外键的表中插入数据时出错的原因以及插入外键为空的方法
    mysql一条语句添加多条数据
    SQL中distinct的用法
    Java实体对象为什么要实现Serializable接口?
    servlet中使用request.getHeader("referer")获取页面从哪跳转过来的
    java动态拼接sql语句并且执行时给sql语句的参数赋值
    正则表达式
  • 原文地址:https://www.cnblogs.com/hxer/p/5188474.html
Copyright © 2011-2022 走看看