ZOJ 2968 Difference Game【欲張り+二分】
8679 ワード
:
Ga、Gb , 。
, C。 Ga Gb 。
:
, Ga Gb 。
。 ( Ga , Gb )
, , Ga Gb ab ,Gb Ga ba ,
Ga Gb, Gb Ga, ,
2*min(ab,ba)。 , 2,
|ab-ba|*(|ab-ba|-1)。 2*min(ab,ba) + |ab - ba| *(|ab -ba|- 1)。
,Ga Gb , Ga C/2
(C/2+1) Gb ,Gb C/2+1(C/2) Ga , 。
By @sake
Source Code:
//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
#include <map>
#include <set>
#include <list>
#include <queue>
#include <vector>
#include <algorithm>
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
#define MOD 1000000007
#define pi acos(-1.0)
using namespace std;
int ga[20010], gb[20010], gc[50000];
bool cmp(const int & a, const int &b){
return a > b;
}
// , key, n, -1
int b_search(int key, int n){
int l = -1, r = n, m;
while (l+1 < r) {
m = (l+r)/2;
if (ga[m] < key) {
l = m;
} else {
r = m;
}
}
return r;
}
int main(){
int t;
scanf("%d", &t);while (t--) {
int n, cost;
scanf("%d%d", &n, &cost);
for (int i = 0; i < n; i ++) {
scanf("%d", &ga[i]);
gc[i] = ga[i];
}
for (int i = 0; i < n; i ++) {
scanf("%d", &gb[i]);
gc[i+n] = gb[i];
}
if (n == 1) {
printf("%d
", ga[0] - gb[0]);
continue;
}
sort(ga, ga+n);
sort(gc, gc+2*n);
sort(gb, gb+n, cmp);
int maxn = -50000;
for (int i = 1; i < 2*n; i ++) {
int ab = b_search(gc[i], n);
int ba = (2*n - i) - (n - ab);
int mab = min(ab, ba);
int fab = abs(ab-ba);
int c = 2*mab + (fab-1)*fab;
if (c <= cost) {
maxn = max(maxn, gc[i]-gc[i-1]);
}
}
if (maxn > 0) {
printf("%d
", maxn);
} else {
int ans = max(ga[cost/2]-gb[cost/2+1], ga[cost/2+1]-gb[cost/2]);
printf("%d
", ans);
}
}
return 0;
}