Xenia and Colorful Gems(二分--思维)
|
给定三个数组a,b,c. 要求从每个数字取一个数,使得两两之差和最小。 求出这个数。 |
\(我又懵逼了。我是会O(n^3)的暴力啊,怎么办。\)
\(\color{Red}{从结果看,选出来的三个数必定存在a<=b<=c}\)
能不能固定一个数或两个数来确定其余数来降低复杂度呢?可以的。
固定b,然后在其他两个数组中找a和c.
\(a一定是刚好小于等于b的,c一定是刚好大于等于b的。\)
那就开始二分吧.......
不过,每个数组都可以作为最小,中间,最大三种可能,所以我们有\(C_3{2}\)种要枚举。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+9;
#define INF 0x7fffffffffffffff
int na,nb,nc,t;
ll a[maxn],b[maxn],c[maxn],ans;
ll ji(ll a,ll b,ll c){
return (a-b)*(a-b)+(a-c)*(a-c)+(b-c)*(b-c);
}
int find_min(ll x,ll a[],int na)
{
int l=1,r=na,mid;
while(r>l)
{
mid=(l+r+1)/2;
if(a[mid]<x) l=mid;
else if(a[mid]>x) r=mid-1;
else
{
l=mid;
break;
}
}
return l;
}
int find_max(ll x,ll a[],int na)
{
int l=1,r=na,mid;
while(r>l)
{
mid=(l+r)/2;
if(a[mid]>x) r=mid;
else if(a[mid]<x) l=mid+1;
else
{
r=mid;
break;
}
}
return r;
}
void solve(ll a[],ll b[],ll c[],int na,int nb,int nc)
{
for(int i=1;i<=nb;i++)//数组b为中间值
{
if(a[1]>b[i]) continue;
if(c[nc]<b[i]) continue;
int q=find_min(b[i],a,na);
int w=find_max(b[i],c,nc);
ans=min(ans,ji(a[q],b[i],c[w]));
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
ans=INF;
scanf("%d%d%d",&na,&nb,&nc);
for(int i=1;i<=na;i++) scanf("%lld",&a[i]);
for(int i=1;i<=nb;i++) scanf("%lld",&b[i]);
for(int i=1;i<=nc;i++) scanf("%lld",&c[i]);
sort(a+1,a+1+na);
sort(b+1,b+1+nb);
sort(c+1,c+1+nc);
solve(a,b,c,na,nb,nc);solve(a,c,b,na,nc,nb);
solve(b,a,c,nb,na,nc);solve(b,c,a,nb,nc,na);
solve(c,a,b,nc,na,nb);solve(c,b,a,nc,nb,na);
cout<<ans<<endl;
}
return 0;
}
Xenia and Colorful Gems(二分--思维)的更多相关文章
- CF #635D Xenia and Colorful Gems 枚举+二分
Xenia and Colorful Gems 题意 给出三个数组,在每个数组中选择一个数字x,y,z,,使得\((x-y)^2+(y-z)^2+(x-z)^2\)最小. 思路 我们假设x<=y ...
- CF R 635 div2 1337D Xenia and Colorful Gems 贪心 二分 双指针
LINK:Xenia and Colorful Gems 考试的时候没想到一个很好的做法. 赛后也有一个想法. 可以考虑答案的样子 x,y,z 可以发现 一共有 x<=y<=z,z< ...
- Codeforces 1337D Xenia and Colorful Gems
题意 给你3个数组\(a, b\)和\(c\),最小化\((x-y)^2+(y-z)^2+(z-x)^2\),其中\(x \in a, y \in b, z \in c\). 解题思路 这题其实第一眼 ...
- Atcoder Grand Contest 006 D - Median Pyramid Hard(二分+思维)
Atcoder 题面传送门 & 洛谷题面传送门 u1s1 Atcoder 不少思维题是真的想不出来,尽管在 Atcoder 上难度并不高 二分答案(这我倒是想到了),检验最上面一层的数是否 \ ...
- codeforces 895B XK Segments 二分 思维
codeforces 895B XK Segments 题目大意: 寻找符合要求的\((i,j)\)对,有:\[a_i \le a_j \] 同时存在\(k\),且\(k\)能够被\(x\)整除,\( ...
- cf1153E 二分思维交互
恶臭的交互题 /* 一个结论:一个矩形将空间分割成两部分,如果开头结尾都在一个部分内,那么穿过矩形边框的线条数就是偶数,反之就是奇数 通过这个结论来进行判断 先询问999次将两个x坐标确定,方法是询问 ...
- Showstopper [POJ3484] [二分] [思维]
Description 给你n个数列,问哪一个数字在所有的数列中出现了奇数次(最多一个). Sample Input 1 10 1 2 10 1 1 10 1 1 10 1 1 10 1 4 4 1 ...
- LightOJ 1138 Trailing Zeroes (III)(二分 + 思维)
http://lightoj.com/volume_showproblem.php?problem=1138 Trailing Zeroes (III) Time Limit:2000MS M ...
- BZOJ - 5427:最长上升子序列 (二分&思维)
现在给你一个长度为n的整数序列,其中有一些数已经模糊不清了,现在请你任意确定这些整数的值, 使得最长上升子序列最长.(为何最长呢?因为hxy向来对自己的rp很有信心) Input 第一行一个正整数 ...
随机推荐
- 03 GUI界面的错误日志查看及清除
右上角图标,会显示当前使用工具的运行报错信息,点击可在下方查看到实际的错误日志
- 编写高质量Python程序(四)库
本系列文章为<编写高质量代码--改善Python程序的91个建议>的精华汇总. 按需选择 sort() 或者 sorted() Python 中常用的排序函数有 sort() 和 sort ...
- E - Dungeon Master BFS
[NWUACM] 你被困在一个三维的空间中,现在要寻找最短路径逃生!空间由立方体单位构成你每次向上下前后左右移动一个单位需要一分钟你不能对角线移动并且四周封闭是否存在逃出生天的可能性?如果存在,则需要 ...
- react-devtools安装调试
初学react,Chrome F12调试,需要一款插件react-devtools. 网上大多对于翻墙不利索的同学大多才用了git源码.npm本地手动打包Chrome拓展程序.如:https://ww ...
- 本地同时使用多个git账号
config文件说明 Git Document指示在首次安装git的时候需要配置Config的相关内容信息,有三个地方存储了config文件,决定了读取的场景不同. 1 /etc/gitconfig: ...
- sublime查看项目代码多少行
---------------------sublime 0.右击要查找的文件; 1.勾选正则( .* ); 3.输入正则表达式 ^[ \t]*[^ \t\n\r]+.*$ 0:搜索 \n 是不是 ...
- 负载均衡服务之HAProxy基础配置(一)
前文我们聊了下haproxy的基础安装,以及怎样去代理后端主机的配置:当然没有很详细的去说配置文件中各指令的意思:有关haproxy的安装和代理后端server可以参考本人博客https://www. ...
- BIOS时间与系统时间(windows/linux时间同步问题)
写作动机 双系统是不少人喜欢的方式,但安装双系统之后一般会出现两个系统时间不一样的问题,刚开始用双系统的时候也没怎么在意,就是装上后在网上找找相关解决方法,复制粘贴代码完事儿.但是次数多了就有点烦了, ...
- linux上Docker安装gogs私服
一.背景介绍 Gogs 是一款类似GitHub的开源文件/代码管理系统(基于Git),Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs ...
- ORM之单表、多表操作
参考1 参考2 表与表之间的关系: 一对一(OneToOneField):一对一字段无论建在哪张关系表里面都可以,但是推荐建在查询频率比较高的那张表里面 一对多(ForeignKey):一对多字段建在 ...