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;
}
原文地址:https://www.cnblogs.com/hyfer/p/5852391.html