JZOJ.5288【NOIP2017模拟8.17】球场大佬
Description
每四个人的总能力值的定义是:任意选两个与另两个PK,能力值的贡献是较高的一组减去较低的一组。比如能力值为5和7的去PK 6和10的差值,那么用较高的减去较低的就是6+10-5-7=4。然后四个人的总能力值要任意两两之间与其他两个的总贡献。如(a,b,c,d)四个人,那么他们的总能力值就是(a,b)一组与(c,d)一组PK,(a,c)一组与(b,d)一组PK,(a,d)一组与(b,c)一组PK,(b,c)一组与(a,d)一组PK,(b,d)一组与(a,c)一组PK,(c,d)一组与(a,b)一组PK这六项PK差值就是四个人的总能力值。
现在,古猴想知道这个场任意四个人的总能力值的和是多少,但是急着要拿拍,你需要马上告诉他这个场的情况?
Input
Output
Sample Input
3
4
1 2 3 3
5
1 2 3 4 5
6
9 18 28 23 12 9
Sample Output
10
76
1176
Data Constraint
对于另外20%的数据n≤200,T≤10
对于另外50%的数据n≤2000,T≤100
保证所有的n加起来不超过2000
题目就是求$\begin{align}\sum_{i=1}^n\sum_{j=i+1}^n\sum_{k=j+1}^n\sum_{l=k+1}^n&|(a_i+a_j)-(a_k+a_l)|+|(a_i+a_k)-(a_j+a_l)|\\+&|(a_i+a_l)-(a_j+a_k)|+|(a_j+a_k)-(a_i+a_l)|\\+&|(a_j+a_l)-(a_i+a_k)|+|(a_k+a_l)-(a_i+a_j)|\end{align}$
朴素的O(n4)显然过不了,我们得考虑一下优化下。
观察公式我们发现它是两两配对进行相减,我们可以尝试将a[i]+a[j]两两配对储存在数组b里,然后计算每对对答案的贡献。
绝对值不好处理, 我们可以尝试去掉绝对值,那么我们就得确定该结果的正负。我们将b数组从大到小排序,发现对于一个bi,它会被减去(i-1)次,加上(nn-i)次(其中nn为b数组里数的个数)
但是我们会发现有个问题,就是有可能会选到具有同一个数的bi,bj,比如bi=ax+ay,但bj=ax+az,这是不合法的情况,因为三个人不符题目要求,我们就要将这一些去掉。
对于一个bi,它是由ax+ay得到的,其中ax>ay,我们考虑bj=ax+az,其中假设bi>bj,那么ay>az,对于这些的az+ax=bj都是不合法的,那么一共就有rank[ay]-1个。(rank[i]表示i的排名)
再对于bk=as+ay,假设bi>bk,那么ax>as,对于这些就有rank[ax]-2个(除去它本身和ay)
bi<bj bi<bk同样的道理也可以得到(n-rank[ay]-1)个和(n-rank[ax])个
这样我们就可以把重复的去掉就可以了。
复杂度O(n2+nlogn2)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 2002000
#define mo 1000000007
using namespace std;
int a[],t;
long long ans,n,len;
struct data{
long long x,y,v;
}b[N];
bool comp(const struct data a,const struct data b){
return a.v>b.v;
}
int main(){
scanf("%d",&t);
while (t--){
scanf("%lld",&n);
ans=;
for (int i=;i<=n;i++)
scanf("%d",&a[i]);
sort(a+,a++n);
len=;
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++)
b[++len].v=a[j]+a[i],b[len].x=i,b[len].y=j;
sort(b+,b++len,comp);
for (long long i=;i<=len;i++)
ans=(b[i].v%mo*(len-i-(b[i].x-+b[i].y-))%mo-b[i].v%mo*(i--(n-b[i].x-+n-b[i].y))%mo+ans+mo)%mo;
printf("%lld\n",ans*%mo);
}
}
神奇的代码
这道题就是通过拆散式子把相等的式子一起加起来从而降低了复杂度。
JZOJ.5288【NOIP2017模拟8.17】球场大佬的更多相关文章
- JZOJ.5289【NOIP2017模拟8.17】偷笑
Description berber走进机房,边敲门边喊:“我是哔哔”CRAZY转过头:“我警告你,哔哔刚刚来过!”“呵呵呵呵……”这时,哔哔站了起来,环顾四周:“你们笑什么?……”巧了,发出笑声的人 ...
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人
[NOIP2017提高A组模拟9.17]信仰是为了虚无之人 Description Input Output Sample Input 3 3 0 1 1 7 1 1 6 1 3 2 Sample O ...
- 【NOIP2017提高A组模拟9.17】猫
[NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...
- 【NOIP2017提高A组模拟9.17】组合数问题
[NOIP2017提高A组模拟9.17]组合数问题 题目 Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数. 举个例子,将{1,2,3}拆分成2 个 ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)
5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...
- JZOJ 5235. 【NOIP2017模拟8.7A组】好的排列
5235. [NOIP2017模拟8.7A组]好的排列 (File IO): input:permutation.in output:permutation.out Time Limits: 1000 ...
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...
随机推荐
- pip install 安装提示unknown 包
pip install setuptools --upgrade should fix the issue
- django Proxy models ---- 代理模式
一个proxy models 不会在数据库中创建新的表.而是与它的基类共用同一个表 1.model 的定义: from django.db import models # Create your mo ...
- [svc]influxdb最佳实战-监控对比
最近在搞容器的监控,遇到influxdb这个库,搞了两天,些许明白了些套路,做个记录,备忘.... 小结如下: influxdb go语言编写 默认情况influxdb创建的库关联autogen的RP ...
- (1)FluidMoveBehavior 之 ListBox 中详细内容项飞出来
在 Blend 中集成了很多行为,首先需要了解一下Behaviors(行为)的几个关键点: (1)Behaviors(行为)是可复用代码集合,可以被任何对象附加使用: (2)设计人员和开发人员可以使用 ...
- dp之完全背包poj2063
题意:求投资k年获得最大投资,每年都选最大利息的方案进行投资k年后就可以得到最多的人民币. 注意:每一年收到的利息都可以作为下一年的本金......其实从测试数据来看,是很好看出来的...... 思路 ...
- SSL的单向认证和双向认证
原文地址:http://alvinhu.com/blog/2013/06/20/one-way-and-two-way-ssl-authentication/?utm_source=tuicool&a ...
- flume中Source
Spooling Directory Source: 以下2组参数解释: fileHeader及fileHeaderKey:fileHeader是个布尔值,可配置为true或者false,表示在flu ...
- 基于Gitolite的Git服务架设
如果不是要与他人协同开发,git根本不需要架设服务器,git可以直接使用本地版本库的路径完成git版本间的操作.但是如果需要和他人分享版本库,协作开发,就需要能够通过网络协议操作git库.git支持的 ...
- 使用Navicat连接阿里云服务器上的MySQL数据库=======Linux 开放 /etc/hosts.allow
使用Navicat连接阿里云服务器上的MySQL数据库 1.首先打开Navicat,文件>新建连接> 2,两张连接方法 1>常规中输入数据库的主机名,端口,用户名,密码 这种直接 ...
- 举例说明:Hadoop vs. NoSql vs. Sql vs. NewSql
转自:http://blog.jobbole.com/86269/ 尽管层次数据库如今在大型机上依然被广泛使用,但关系数据库(RDBMS)(SQL)已经占领了数据库市场,并且表现的相当优异.我们存 ...