• codevs4437 YJQ Arranges Sequences


    题目描述 Description

    神犇YJQ有两个长度均为n的数列A和B,并且A是一个单调不增的数列。他认为这两个数列的优美度为。有一天YJQ很无聊,他把Bi进行重新排列,得到了许多不同的优美度。他想知道他能得到的最大的优美度和最小的优美度的差是多少。

    输入描述 Input Description

    第一行一个整数n表示数列长度,接下来n行每行两个整数表示Ai和Bi

    输出描述 Output Description

    一行,一个整数表示优美度的最大值与最小值的差

    样例输入 Sample Input

    2
    2 1
    1 2

    样例输出 Sample Output

    1

    数据范围及提示 Data Size & Hint

    对于30%的数据,n < 10;

    对于50%的数据,n < 1000;

    对于100%的数据,1 < n < 2 *10^5,1< Ai,Bi < 10^9。

    请注意数据范围!!!!!!!!!!!!!!!!!!!

    注意:10^5*10^9*10^9>18446744073709551615(Unsigned  Long Long的最大值)

    #include <cstdio> 
    #include <cmath> 
    #include <iostream> 
    #include <cstring> 
    #include <algorithm>
    #define ll long long
    using namespace std; 
     
    const int P=10000,L=10,W=4; 
    char s[L*W]; 
    struct Big 
      { 
        int len;int data[L];bool fu; 
        void clear()  
          { 
            memset(data,0,sizeof(data)); 
            len=0;fu=false; 
          } 
        int& operator [] (int k) 
          { 
            return data[k]; 
          } 
        void operator = (int k) 
          { 
            clear(); 
            if (k<0) fu=true,k=-k;else fu=false; 
            len=0; 
            while (k) data[++len]=k%P,k/=P;  
            if (len==0) len=1; 
          } 
        bool operator < (Big b) 
          { 
            bool t=false; 
            if (fu && !b.fu) return true; 
            if (!fu && b.fu) return false; 
            if (fu && b.fu) t=true; 
            if (len<b.len) return true^t; 
            if (len>b.len) return false^t; 
            for (int i=len;i;--i) 
              { 
                if (data[i]<b[i]) return true^t; 
                if (data[i]>b[i]) return false^t; 
              } 
            return false; 
          } 
        bool operator <= (Big b) 
          { 
            bool t=false; 
            if (fu && !b.fu) return true; 
            if (!fu && b.fu) return false; 
            if (fu && b.fu) t=true; 
            if (len<b.len) return true^t; 
            if (len>b.len) return false^t; 
            for (int i=len;i;--i) 
              { 
                if (data[i]<b[i]) return true^t; 
                if (data[i]>b[i]) return false^t; 
              } 
            return true; 
          } 
        bool operator > (Big b) 
          { 
            bool t=false; 
            if (fu && !b.fu) return false; 
            if (!fu && b.fu) return true; 
            if (fu && b.fu) t=true; 
            if (len<b.len) return false^t; 
            if (len>b.len) return true^t; 
            for (int i=len;i;--i) 
              { 
                if (data[i]<b[i]) return false^t; 
                if (data[i]>b[i]) return true^t; 
              } 
            return false; 
          } 
        bool operator >= (Big b) 
          { 
            bool t=false; 
            if (fu && !b.fu) return false; 
            if (!fu && b.fu) return true; 
            if (fu && b.fu) t=true; 
            if (len<b.len) return false^t; 
            if (len>b.len) return true^t; 
            for (int i=len;i;--i) 
              { 
                if (data[i]<b[i]) return false^t; 
                if (data[i]>b[i]) return true^t; 
              } 
            return true; 
          } 
        bool operator == (Big b) 
          { 
            if (fu!=b.fu) return false; 
            if (len<b.len) return false; 
            if (len>b.len) return false; 
            for (int i=len;i;--i) 
              if (data[i]!=b[i]) return false; 
            return true; 
          } 
        bool operator == (int k) 
          { 
            if (k<0) 
              { 
                if (!fu) return false; 
                k=-k; 
              } else if (fu) return false; 
            if (k>=P) 
              { 
                Big b;b=k; 
                return *this==b; 
              } 
                else return len==1 && data[1]==k; 
          } 
        bool operator != (Big b) 
          { 
            if (fu!=b.fu) return true; 
            if (len<b.len) return true; 
            if (len>b.len) return true; 
            for (int i=len;i;--i) 
              if (data[i]!=b[i]) return true; 
            return false; 
          } 
        bool operator != (int k) 
          { 
            if (k<0) 
              { 
                if (!fu) return true; 
                k=-k; 
              } else if (fu) return true; 
            if (k>=P) 
              { 
                Big b;b=k; 
                return *this!=b; 
              } 
                else return !(len==1 && data[1]==k); 
          } 
        Big operator + (Big b) 
          { 
            Big a=*this,c;c.clear(); 
            if (a.fu && b.fu)  
              { 
                a.fu=false;b.fu=false;c=a+b; 
                if (c.len!=1 || c[1]!=0) c.fu=true; 
                return c; 
              } 
            if (a.fu && !b.fu)  
              {a.fu=false;return b-a;} 
            if (!a.fu && b.fu) 
              {b.fu=false;return a-b;}  
            a.len=max(a.len,b.len); 
            for (int i=1;i<=a.len;++i) 
              { 
                a[i+1]+=(a[i]+b[i])/P; 
                a[i]=(a[i]+b[i])%P; 
              } 
            if (a[a.len+1]) ++a.len; 
            while (a[a.len]==0 && a.len>1) --a.len; 
            return a; 
          } 
        Big operator + (int k) 
          { 
            Big a=*this,b;b=k; 
            return a+b; 
          } 
        Big operator - (Big b) 
          { 
            Big a=*this,c;c.clear(); 
            if (a.fu && !b.fu) 
              { 
                a.fu=false;b.fu=false;c=a+b; 
                if (c.len!=1 || c[1]!=0) c.fu=true; 
                return c; 
              } 
            if (a.fu && b.fu)  
              { 
                a.fu=false;b.fu=false;return b-a; 
              } 
            if (!a.fu && b.fu) 
              { 
                b.fu=false; return a+b; 
              } 
            if (a<b) swap(a,b),a.fu=true;else a.fu=false; 
            for (int i=1;i<=a.len;++i) 
              { 
                if (a[i]<b[i]) a[i]+=P,--a[i+1]; 
                a[i]-=b[i]; 
              } 
            while (a[a.len]==0 && a.len>1) --a.len; 
            if (a.len==1 && a[1]==0) a.fu=false; 
            return a; 
          } 
        Big operator - (int k) 
          { 
            Big a=*this,b;b=k; 
            return a-b; 
          } 
        Big operator * (Big b) 
          { 
            Big c;c.clear(); 
            c.len=len+b.len-1; 
            for (int i=1;i<=len;++i) 
              for (int j=1;j<=b.len;++j) 
                { 
                  c[i+j-1]+=data[i]*b[j]; 
                  c[i+j]+=c[i+j-1]/P; 
                  c[i+j-1]%=P; 
                } 
            if (c[c.len+1]) ++c.len; 
            while (c[c.len]==0 && c.len>1) --c.len; 
            c.fu=fu^b.fu; 
            if (c.len==1 && c[1]==0) c.fu=false; 
            return c; 
          } 
        Big operator * (int k) 
          { 
            Big a=*this; 
            if (k<0) a.fu=!a.fu,k=-k; 
            if (k>=P)  
              { 
                Big b;b=k; 
                return a*b; 
              } 
            for (int i=1;i<=a.len;++i) a[i]*=k; 
            for (int i=1;i<=a.len;++i) 
              a[i+1]+=a[i]/P,a[i]%=P; 
            while (a[a.len+1])  
              { 
                ++a.len; 
                a[a.len+1]=a[a.len]/P; 
                a[a.len]%=P; 
              } 
            while (a[a.len]==0 && a.len>1) --a.len; 
            if (a.len==1 && a[1]==0) a.fu=false; 
            return a; 
          } 
        Big operator / (int k) 
          { 
            Big a=*this;int g=0; 
            if (k<0) a.fu=!a.fu,k=-k; 
            for (int i=a.len;i;--i) 
              { 
                a[i]+=g*P; 
                g=a[i]%k; 
                a[i]/=k; 
              } 
            while (a[a.len]==0 && a.len>1) --a.len; 
            if (a.len==1 && a[1]==0) a.fu=false; 
            return a; 
          } 
        Big operator % (int k) 
          { 
            Big b;b=k; 
            return *this%b; 
          } 
        Big operator / (Big b) 
          { 
            Big c,d;c=0;d=0;c.fu=fu^b.fu;b.fu=false; 
            for (int i=len;i;--i) 
              { 
                d=d*P+data[i]; 
                int ans=0,l=0,r=P-1; 
                while (l<=r) 
                  { 
                    int mid=(l+r)>>1; 
                    if (b*mid<=d) ans=mid,l=mid+1; 
                    else r=mid-1; 
                  } 
                c[i]=ans; 
                d=d-b*c[i]; 
              } 
            c.len=len; 
            while (c[c.len]==0 && c.len>1) --c.len; 
            return c; 
          } 
        Big operator % (Big b) 
          { 
            Big c,d;c=0;d=0;c.fu=fu^b.fu;b.fu=false; 
            for (int i=len;i;--i) 
              { 
                d=d*P+data[i]; 
                int ans=0,l=0,r=P-1; 
                while (l<=r) 
                  { 
                    int mid=(l+r)>>1; 
                    if (b*mid<=d) ans=mid,l=mid+1; 
                    else r=mid-1; 
                  } 
                c[i]=ans; 
                d=d-b*c[i]; 
              } 
            c.len=len; 
            while (c[c.len]==0 && c.len>1) --c.len; 
            d=*this-b*c; 
            return d; 
          } 
        Big operator ^ (int t) 
          { 
            Big a=*this,ans;ans=1; 
            while (t) 
              { 
                if (t&1) ans=ans*a;t>>=1;a=a*a; 
              } 
            return ans; 
          }     
        void read() 
          { 
            scanf("%s",s); 
            clear(); 
            len=1; 
            int pow=1,t=1,l=strlen(s),stop=0; 
            if (s[0]=='-') fu=true,stop=1; 
            for (int i=l-1;i>=stop;--i) 
              { 
                if (t>W) t=pow=1,++len; 
                data[len]+=pow*(s[i]-'0'); 
                ++t,pow*=10; 
              } 
          } 
        void write() 
          { 
            if (fu) printf("%c",'-'); 
            printf("%d",data[len]); 
            for (int i=len-1;i;--i) 
              { 
                if (data[i]<10) putchar('0'); 
                if (data[i]<100) putchar('0'); 
                if (data[i]<1000) putchar('0'); 
                printf("%d",data[i]); 
              } 
          } 
        void writeln() 
          { 
            write();printf("
    "); 
          } 
      } ;
    inline long long read()
    {
        ll 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();}
        return x*f;
    }
    Big ansa,ansb,ansd,ansc;
    long long a[200005],b[200005],n;
    int main(){
        cin>>n;
        for(int i = 1;i <= n;i++){
            a[i] = read();
            b[i] = read();
        }
        sort(b+1,b+1+n);
        for(int i = 1;i <= n;i++){
            ansd = a[i];
            ansb = ansd *(b[n-i+1] - b[i]);
            ansc = ansc + ansb;
        }
        ansc.write();
        return 0;
    }
  • 相关阅读:
    springboot 实现 aop
    使用@import导入实现了ImportBeanDefinitionRegistrar接口的类,不能被注册为bean
    Spring Boot 动态数据源(多数据源自动切换)
    springboot2动态数据源的绑定
    三分钟学会@Autowired@Qualifier@Primary注解
    java复制文件的4种方式
    五款最好的免费同步软件
    springboot2多数据源完整示例
    WebSocket 结合 Nginx 实现域名及 WSS 协议访问
    Spring的注解@Qualifier注解
  • 原文地址:https://www.cnblogs.com/hyfer/p/5852391.html
Copyright © 2020-2023  润新知