codeforces 620D Professor GukiZ and Two Arrays
#include <bits/stdc++.h> using namespace std; const int maxn = + ; const long long inf = 1e18; int n, m; long long suma, sumb; int a[maxn], b[maxn]; long long dbl_a[maxn], dbl_b[maxn]; long long sum_dbl_a[maxn * maxn + ], sum_dbl_b[maxn * maxn + ]; int main()
{
map<int, int> pos_a;
scanf("%d", &n);
for(int i = ; i <= n; ++i){
scanf("%d", &a[i]);
suma += a[i];
dbl_a[i] = a[i] * ;
pos_a[dbl_a[i]] = i;
} map<long long, pair<int, int>> m_a;
map<int, long long> two_pos_a;
int cnt_a = , cnt_b = ;
for(int i = ; i <= n; ++i){
for(int j = i + ; j <= n; ++j){
m_a[dbl_a[i] + dbl_a[j]] = make_pair(i, j);
sum_dbl_a[++cnt_a] = dbl_a[i] + dbl_a[j];
}
}
scanf("%d", &m);
for(int i = ; i <= m; ++i){
scanf("%d", &b[i]);
sumb += b[i];
dbl_b[i] = b[i] * ;
} long long diff = (suma - sumb); if(diff == ) {
printf("0\n0\n");
return ;
} sort(dbl_a+, dbl_a++n); long long one_swap_ans = abs(suma - sumb);
long long two_swap_ans = abs(suma - sumb);
int one_swap_a = , one_swap_b = ;
int two_swap_a_1 = , two_swap_a_2 = , two_swap_b_1 = , two_swap_b_2 = ; for(int i = ; i <= m; ++i){
long long tmp = diff + dbl_b[i];
int pos = lower_bound(dbl_a+, dbl_a+n+, tmp) - dbl_a;
//printf("%d\n", pos);
long long big_res = inf;
if(pos <= n) big_res = dbl_a[pos-]; long long small_res = inf;
if(pos - >= ) small_res = dbl_a[pos - ]; if(abs(big_res - tmp) > abs(small_res - tmp)){
//printf("%d %d %d\n",pos_a[10], dbl_a[pos-1], pos);
long long temp = abs(small_res - tmp);
if(one_swap_ans > temp){
one_swap_ans = temp;
one_swap_a = pos_a[dbl_a[pos-]], one_swap_b = i;
}
} else {
long long temp = abs(big_res - tmp);
if(one_swap_ans > temp){
one_swap_ans = temp;
one_swap_a = pos_a[dbl_a[pos]], one_swap_b = i;
}
} } sort(sum_dbl_a + , sum_dbl_a + cnt_a + ); for(int i = ; i <= m; ++i){
for(int j = i + ; j <= m; ++j){
long long tmp = diff + dbl_b[i] + dbl_b[j];
int pos = lower_bound(sum_dbl_a+, sum_dbl_a+cnt_a+, tmp) - sum_dbl_a;
long long big_res = inf;
if(pos <= cnt_a) big_res = sum_dbl_a[pos]; long long small_res = inf;
if(pos - >= ) small_res = sum_dbl_a[pos - ]; if(abs(big_res - tmp) > abs(small_res - tmp)){
long long temp = abs(small_res - tmp); if(two_swap_ans > temp){
two_swap_ans = temp;
two_swap_a_1 = m_a[sum_dbl_a[pos-]].first;
two_swap_a_2 = m_a[sum_dbl_a[pos-]].second;
two_swap_b_1 = i;
two_swap_b_2 = j;
}
} else {
long long temp = abs(big_res - tmp); if(two_swap_ans > temp){
two_swap_ans = temp;
two_swap_a_1 = m_a[sum_dbl_a[pos]].first;
two_swap_a_2 = m_a[sum_dbl_a[pos]].second; two_swap_b_1 = i;
two_swap_b_2 = j;
}
} }
} long long ans = min(abs(diff), min(abs(one_swap_ans), abs(two_swap_ans)));
printf("%I64d\n", ans);
if(ans == diff){
printf("0\n");
} else if(one_swap_ans == ans){
printf("1\n");
printf("%d %d\n", one_swap_a, one_swap_b);
} else {
printf("2\n");
printf("%d %d\n", two_swap_a_1, two_swap_b_1);
printf("%d %d\n", two_swap_a_2, two_swap_b_2);
} return ;
}
只交换一次的情况
原来 |Suma - Sumb|
交换后 Suma - xi + yj - (sumb - yj + xi) = suma - sumb + 2(yj - xi) -> 0
则在确定xi的情况下 需要在 b序列里找到 最接近 xi 的 (suma - sumb) /2 + yj的 yj
交换两次的情况
原来 |suma - sumb|
交换后 Suma - xi - xj + yk + yl - (sumb + xi + xj - yk - yl) = suma - sumb + 2((yk + yl) - (xi + xj)) -> 0
则在确定 xi xj的情况下 需要在b序列里找到 最接近 xi + xj的 (suma - sumb)/2 + yk + yl的 yk 和 yl
codeforces 620D Professor GukiZ and Two Arrays的更多相关文章
- CodeForces 620D Professor GukiZ and Two Arrays 双指针
Professor GukiZ and Two Arrays 题解: 将a数组都sort一遍之后, b数组也sort一遍之后. 可以观察得到 对于每一个ai来说, 整个数组bi是一个V型的. 并且对于 ...
- Educational Codeforces Round 6 D. Professor GukiZ and Two Arrays 二分
D. Professor GukiZ and Two Arrays 题目连接: http://www.codeforces.com/contest/620/problem/D Description ...
- Educational Codeforces Round 6 D. Professor GukiZ and Two Arrays
Professor GukiZ and Two Arrays 题意:两个长度在2000的-1e9~1e9的两个序列a,b(无序);要你最多两次交换元素,使得交换元素后两序列和的差值的绝对值最小:输出这 ...
- 【CodeForces 620D】Professor GukiZ and Two Arrays
题 题意 两个数列,一个有n个数,另一个有m个数,让你最多交换两次两个数列的数,使得两个数列和的差的绝对值最小,求这个差的绝对值.最少交换次数.交换数对 分析 交换0次.1次可得到的最小的差可以枚举出 ...
- CodeForces 620A Professor GukiZ's Robot
水题 #include<cstdio> #include<cstring> #include<cmath> #include<stack> #inclu ...
- Educational Codeforces Round 6 A. Professor GukiZ's Robot 水
A. Professor GukiZ's Robot Professor GukiZ makes a new robot. The robot are in the point with coor ...
- 【24.67%】【codeforces 551C】 GukiZ hates Boxes
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【74.89%】【codeforces 551A】GukiZ and Contest
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- codeforces 551 C GukiZ hates Boxes
--睡太晚了. ..脑子就傻了-- 这个题想的时候并没有想到该这样-- 题意大概是有n堆箱子从左往右依次排列,每堆ai个箱子,有m个人,最開始都站在第一个箱子的左边, 每个人在每一秒钟都必须做出两种选 ...
随机推荐
- C连接oracle数据库
int db_conn_main() { EXEC SQL BEGEIN DECLARE SECTION; +]; +]; +]; varchar username[]; varchar passwo ...
- js转化与排序
1.对象转化为数组 object.keys() var obj={a:3,b:7,c:8,d:false} alert(Object.keys(obj)) 注意此函数会把对象的key转化为数组 spl ...
- loj10131 暗的连锁
传送门 分析 首先我们知道如果在一棵树上加一条边一定会构成一个环,而删掉环上任意一条边都不改变连通性.我们把这一性质扩展到这个题上不难发现如果一条树边不在任意一个新边构成的环里则删掉这条边之后可以删掉 ...
- 去掉utf-8的Bom头:使用java以及jdbc不使用第三方库执行sql文件脚本
package com.xxx.xxx.dao; import java.io.BufferedReader; import java.io.File; import java.io.FileInpu ...
- Socket编程--基础(基本server/client实现)
IPv4套接口地址结构 IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件中 LINUX结构下的常用结构,一般创建套接字的时候都要将这个结构里面的 ...
- CodeForces 402D Upgrading Array (数学+DP)
题意:给出一个数列,可以进行一种操作将某一个前缀除去他们的gcd,有一个函数f(x),f(1) = 0 , f(x) = f(x/p)+1,f(x) = f(x/p)-1(p是坏素数), 求 sum( ...
- .net 索引器
索引器允许类或结构的实例就像数组一样进行索引. 索引器类似于属性,不同之处在于它们的访问器采用参数. 在下面的示例中,定义了一个泛型类,并为其提供了简单的 get 和 set 访问器方法(作为分配和检 ...
- 第一个HelloWorld!
$.介绍 1.eclipse的基本使用 2.第一个程序HelloWorld 3.总结 $.基本使用 对于刚入门的java新手来说选择一个舒适的编译器能让你快速的上手java的程序编写. 针对英语low ...
- 基于注解的AOP配置
配置文件 spring配置文件中的约束 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ...
- echarts设置地图大小比例,大小设置
设置地图大小可通过以下属性设置: geo.aspectScale number [ default: 0.75 ] 这个参数用于 scale 地图的长宽比. 最终的 aspect 的计算方式是:geo ...