POJ - 3244-Difference between Triplets
其实我最开始没有这道题。。。是做到UPC-11079-小P的决斗,训练结束后然后搜索了一波,才了解这个题的。
非常牛逼的题。。。这么多人做出来了。。。我好菜。。。
对于每对三元组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),
给多个三元组,求两两之间差值之和。
给出一个转化 max,min与绝对值之间的转化:
max(a,b,c)-min(a,b,c)=(|a-b|+|b-c|+|c-a|)/2
证明这个式子:给定一个递增的序列,a1,a2,a3,a4...an
max(a1,a2,a3...an)-min(a1,a2,a3...an)
=1/2(an-a1+an-a1)=an-an-1+an-1-an-2....-a2+a2-a1+an-a1
=1/2(|an-an-1|+|an-1-an-2|+...+|a2-a1|+|a1-an|)
这玩意是严重对称的。。。然后。。。我也不是很清楚了
知道这个性质以后,我们考虑一个叫贡献的东西,首先肯定把
a=xi-yi b=yi-zi c=zi-xi 保存下来。
首先绝对值是非常讨厌的,我们通过排序去掉了绝对值。
然后我们考虑这样一个东西,当前是i位置,那么前面的都是比我小的,所以再对于前面i-1匹配时,a[i]做的是被减数,因此a[i]*(i-1)
对于后面n-i-1个数,我们发现它是做减数,那么贡献其实是-(n-i)*a[i],所以单点贡献是a[i]*(i-1)-(n-i)*a[i],对与其他的也是一样的。
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#define LL long long
using namespace std;
const int maxx = ;
LL L[maxx];
LL J[maxx];
LL K[maxx];
LL a[maxx];
LL b[maxx];
LL c[maxx];
int main(){
int n;
while(~scanf("%d",&n)&&n){ for (int i=;i<=n;i++){
scanf("%lld%lld%lld",&L[i],&J[i],&K[i]);
a[i]=L[i]-J[i];
b[i]=J[i]-K[i];
c[i]=K[i]-L[i];
}
sort(a+,a++n);
sort(b+,b++n);
sort(c+,c++n);
LL ans=;
for (int i=;i<=n;i++){
ans+=a[i]*(i-)-a[i]*(n-i);
ans+=b[i]*(i-)-b[i]*(n-i);
ans+=c[i]*(i-)-c[i]*(n-i);
}
printf("%lld\n",ans/);
}
return ;
}
POJ - 3244-Difference between Triplets的更多相关文章
- POJ 3419 Difference Is Beautiful(RMQ+二分 或者 模拟)
Difference Is Beautiful Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%lld & %l ...
- POJ 2253 Difference of Clustering
题意:给出一堆点,求从起点到终点的所有通路中相邻点的距离的最大值的最小值.(意思就是自己百度吧……) 解法:用相邻点的最大值作为权值代替路径的距离跑最短路或者最小生成树.然后我写了一个我以为是优化过的 ...
- POJ 3419 Difference Is Beautiful(RMQ变形)
题意:N个数,M个询问,每个询问为一个区间,求区间最长连续子序列,要求每个数都不同(perfect sequence,简称PS). 题解:很容易求出以每个数为结尾的ps,也就是求区间的最大值.有一个不 ...
- POJ 3419 Difference Is Beautiful
先处理出每一个i位置向左最远能到达的位置L[i].每一次询问,要找到L,R区间中的p位置,p位置左边的L[i]都是小于L的,p位置开始,到R位置,L[i]都大于等于L,对于前者,最大值为p-L,后者求 ...
- POJ 3419 Difference Is Beautiful (DP + 二分 + rmq)
题意:给n个数(n<=200000),每个数的绝对值不超过(10^6),有m个查询(m<=200000),每次查询区间[a,b]中连续的没有相同数的的最大长度. 析:由于n太大,无法暴力, ...
- ACM数学
1.burnside定理,polya计数法 这个专题我单独写了个小结,大家可以简单参考一下:polya 计数法,burnside定理小结 2.置换,置换的运算 置换的概念还是比较好理解的,< ...
- [转] POJ数学问题
转自:http://blog.sina.com.cn/s/blog_6635898a0100magq.html 1.burnside定理,polya计数法 这个大家可以看brudildi的<组合 ...
- acm数学(转)
这个东西先放在这吧.做过的以后会用#号标示出来 1.burnside定理,polya计数法 这个大家可以看brudildi的<组合数学>,那本书的这一章写的很详细也很容易理解.最好能 ...
- poj3244(公式题)
Difference between Triplets Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2476 Acce ...
- POJ 2718 Smallest Difference(最小差)
Smallest Difference(最小差) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 Given a numb ...
随机推荐
- linux:644、755、777权限详解
第一位7等于4+2+1,rwx,所有者具有读取.写入.执行权限: 第二位5等于4+1+0,r-x,同组用户具有读取.执行权限但没有写入权限: 第三位5,同上,也是r-x,其他用户具有读取.执行权限但没 ...
- mssql sqlserver 获取指定汉字的笔画数的方法分享
转自:http://www.maomao365.com/?p=6421 摘要: 下文讲述计算汉字笔画数的sql函数分享,如下所示: 例:建立汉字笔画数sql函数 )) returns int as b ...
- 4. svg学习笔记-文档结构元素和样式的使用
svg除了绘图元素之外还有一部分是专门用于文档结构的,这类元素有<g>,<use>,<defs>,<symbol>等 <g>元素 如果我们仅 ...
- JS一些实用的方法
1.首次为变量赋值时务必使用var关键字 变量没有声明而直接赋值得话,默认会作为一个新的全局变量,要尽量避免使用全局变量. 2.使用===取代== ==和!=操作符会在需要的情况下自动转换数据类型.但 ...
- Dockfile制作镜像
讲一个简单的案例 @哈希码用来校验,这样子会安全 MAINTANIER可能将会被LABEL代替,仅仅说说明一下镜像信息罢了. 1.首先是我们创建一个镜像 [root@ELK-chaofeng08 ~] ...
- ubantu下安装pip,python,pycharm,numpy,scipy,matplotlibm,pandas 以及sklearn
ubuntu 安装 pip 及 pip 常用命令: https://blog.csdn.net/danielpei1222/article/details/62969815 ubuntu下不同版本py ...
- 【Linux基础】VM使用
VM三种联网方法和原理 (1)Bridged桥接 使用VMnet0虚拟交换机,此时虚拟机相当与网络上的一台独立计算机与主机一样,拥有一个独立的IP地址,所有机器均可互访,可以联网.使用桥接方式,A,A ...
- Contest Setting 2018 ICPC Pacific Northwest Regional Contest dp
题目:https://vj.69fa.cn/12703be72f729288b4cced17e2501850?v=1552995458 dp这个题目网上说是dp+离散化这个题目要对这些数字先处理然后进 ...
- Centos 6.7 安装mongodb
下载mongodb https://www.mongodb.com/download-center#community 2.解压文件 tar -zxvf mongodb-linux-x86_64-3 ...
- springBoot 搭建web项目(前后端分离,附项目源代码地址)
springBoot 搭建web项目(前后端分离,附项目源代码地址) 概述 该项目包含springBoot-example-ui 和 springBoot-example,分别为前端与后端,前后端 ...