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 ...
随机推荐
- CString中Format函数与格式输入与输出
CString中Format函数与格式输入与输出 Format是一个非经常常使用.却又似乎非常烦的方法,下面是它的完整概貌.以供大家查询之用: 格式化字符串forma("%d" ...
- mfc获取控件在对话框上的位置
CRect rect; GetDlgItem(控件ID)->GetWindowRect(&rect);//获取控件的屏幕坐标ScreenToClient(&rect);//转换为 ...
- Python3 isidentifier() 方法
描述 Python3 isidentifier() 方法用于判断字符串是否是有效的 Python 标识符,可用来判断变量名是否合法. 语法 isidentifier() 方法语法: S.isident ...
- Altium PCB布局时快速摆放元件的技巧
http://www.openedv.com/posts/list/45238.htm pcb窗口:工具--->交叉选择模式
- MySQL主从复制状态及数据一致性监测工具
转: https://blog.csdn.net/m0_37814112/article/details/80914713
- ajax创建
ajax对象创建和使用 //创建ajax对象 function createXMLhttp(){ var xmlhttp; if(window.XMLHttpRequest) {// code for ...
- python登陆Tom邮箱的代码一例
本文出处参考:http://www.cnblogs.com/LinuxHunter/archive/2010/11/30/1891635.html 在很多的python 教程中都会讲到登录邮箱或发送邮 ...
- Android实战简易教程-第二十三枪(基于Baas的用户注冊验证username是否反复功能!)
接上一篇,加入验证用户名是否已经注冊功能! 仅仅须要改动MainActivity.java: package com.example.logintest; import java.util.List; ...
- 集群中的session共享存储 实现会话保持
每组web服务器端做一下调整: [root@web03 memcache-2.2.6]# egrep "(session.save_handler|session.save_path)&qu ...
- 改变placeholder的样式
input::-webkit-input-placeholder{ font-size:12px; color:#d2d2d2 }