MAX-MIN的绝对值问题

 

 

MAX MIN 的关系1

Problem:A

Time Limit:1500ms

Memory Limit:65535K

Description

给出N个(x,y)点(x,y为整数),我们令

求F(n)

Input

输入T,T组数据 T<=10
输入N,N<=100000
N行,xi,yi  (-1000,000<=xi,yi<=1000,000)

Output

输出F(N)

Sample Input

2
2
1 2
3 2
3
1 3
4 0
2 2

Sample Output

2
12

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
ll a[100005];
int main()
{
    std::ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--){
        int num;
        cin>>num;
        for(int i=1;i<=num;i++){
            int aa,bb;
            cin>>aa>>bb;
            a[i]=aa-bb;
        }
        sort(a+1,a+1+num);
        ll ans=0;
        for(int i=1;i<=num;i++){
            ans+=(2*i-num-1)*a[i];
        }
        cout<<ans<<endl;
    }
}

MAX MIN 的关系2

Problem:J

Time Limit:4000ms

Memory Limit:65535K

Description

给出N个(x,y,z)点(x,y,z为整数),我们令

求F(n)

Input

多组输入数据
每组数据输入N,N<=100,000
N行,xi,yi,zi  (-1000,000<=xi,yi,zi<=1000,000)

Output

输出F(N)

Sample Input

2
1 2 1
3 2 3
3
1 3 0
4 0 8
2 2 8

Sample Output

2
24

 

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
ll a[100005],b[100005],c[100005];
int main()
{
    std::ios::sync_with_stdio(false);
    int T;

        int num;
        while(cin>>num){

        for(int i=1;i<=num;i++){
            int aa,bb,cc;
            cin>>aa>>bb>>cc;
            a[i]=aa-bb;
            b[i]=bb-cc;
            c[i]=aa-cc;
        }
        sort(a+1,a+1+num);
        sort(b+1,b+1+num);
        sort(c+1,c+1+num);
        ll ans=0;
        for(int i=1;i<=num;i++){
            ans+=(2*i-num-1)*a[i];
            ans+=(2*i-num-1)*b[i];
            ans+=(2*i-num-1)*c[i];
        }
        cout<<ans/2<<endl;
    }
}

 

小P的决斗

时间限制: 1 Sec  内存限制: 128 MB
提交: 40  解决: 12
[提交] [状态] [讨论版] [命题人:]

 

题目描述

小P马上就要NOIP了,所以他停课在机房学习。

一天小P在机房和同学交流代码,小P发现他的同学大括号不换行,但是小P的大括号换行。于是他们在争执了大括号是否要换行的问题后决定通过决斗分出胜负。

他们每个人各有三个属性值,ap,ad,生命值。这三个属性可以看成一个三元组:

对于每对三元组Ta=(La,Ja,Ka),Tb=(Lb,Jb,Kb),定义Ta,Tb之间的差值D为D(Ta,Tb)=max(La−Lb,Ja−Jb,Ka−Kb)−min(La−Lb,Ja−Jb,Ka−Kb)。

在决斗中,越来越多的对大括号是否要换行持有不同意见的人加了进来,所以决斗变成了团战。

小P想知道为n个人属性值之间两两差值之和,这样他能够知道自己是否能够胜利。

 

输入

第一行一个整数n。

之后的n行,每行三个整数,表示Li、Ji、Ki。

 

输出

输出一行,为n个三元组之间两两差值之和(对10^9+7取模)。

 

样例输入

复制样例数据

2
1 2 3
3 2 1

样例输出

4

 

提示

对于10%的数据,n≤103;
对于50%的数据,n≤2×104;
对于80%的数据,n≤2×105,1≤Li,Ji,Ki≤107;
对于100%的数据,1≤n≤5×105,1≤Li,Ji,Ki≤108。

这里多了个取模的规则

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
#define MOD 1000000007
#define ll long long
ll a[500005],b[500005],c[500005];
ll q(ll a,ll b,ll mod) {
    ll res = 1;
    while(b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
int main()
{
    std::ios::sync_with_stdio(false);
    int T;
    int num;
    while(cin>>num){
    for(int i=1;i<=num;i++){
        ll aa,bb,cc;
        cin>>aa>>bb>>cc;
        a[i]=aa-bb;
        b[i]=bb-cc;
        c[i]=aa-cc;
    }
    sort(a+1,a+1+num);
    sort(b+1,b+1+num);
    sort(c+1,c+1+num);
    ll ans=0;
    for(int i=1;i<=num;i++){
        ans+=((2*i-num-1))*(a[i]);
        if(ans>0)
            ans%=MOD;
        ans+=((2*i-num-1))*(b[i]);
        if(ans>0)
            ans%=MOD;
        ans+=((2*i-num-1))*(c[i]);
        if(ans>0)
            ans%=MOD;
    }
    ans=ans*q(2,MOD-2,MOD)%MOD;
    cout<<ans<<endl;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值