Thuật toán: Cố định một điểm bên một bờ, dùng lower_bound tìm vị trí điểm của bờ bên cạnh. Từ đó min hóa trị cần tìm.
Code:
/*
Coder : Nguyen Duc Tam
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<set>
#include<vector>
#include<utility>
#include<map>
#include<list>
#include<queue>
#include<deque>
#include<stack>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<iomanip>
#include<ctime>
using namespace std;
#define REP(i, start, end, step) for(int i = start; i < end; i += step)
#define DOWN(i, start, end, step) for(int i = start; i > end; i -= step)
#define FOR(it,c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
#define ALL(c) (c).begin(), (c).end()
#define SZ(x) ((int)(x).size())
#define X first
#define Y second
#define L(x,i) ((x) << (i))
#define R(x,i) ((x) >> (i))
#define AND(a,b) ((a) & (b))
#define OR(a,b) ((a) | (b))
#define XOR(a,b) ((a) ^ (b))
#define NOT(a) (~(a))
#define SB(x,i) (OR((x), L(1, (i)))) // x | 1 << i
#define CB(x,i) (AND((x),NOT(L(1,(i))))) // x & ~(1 << i)
#define TB(x,i) (AND((x), L(1,(i)))) // x & (1 << i)
#define FILL(a,val) memset(a,val,sizeof(a));
#define INIT(a,l,r,val) REP(i,l,r,1) (a)[i] = val;
#define DIG(c) (int)((c) - '0')
#define CHR(c) (char)((c) + '0')
#define LOW(c) (char)((c) + 32)
#define UPP(c) (char)((c) - 32)
#define SQR(a) (a) * (a)
#define EPS 1e-7
#define OO 1000000005
#define N 100005
const int DAY[13] = {-1,31,29,31,30,31,30,31,31,30,31,30,31};
const int dx4[4] = {};
const int dy4[4] = {};
const int dx8[8] = {};
const int dy8[8] = {};
typedef pair<int,int> II;
typedef pair<II,int> D;
typedef long long LL;
typedef unsigned long long ULL;
typedef unsigned char UC;
vector<int>::iterator it, low, up; // using FOR, lower_bound, upper_bound
pair<vector<int>,vector<int> > bound; // using function equal_range(first, last, x)
int n,m,a,b,y[N],y_[N],l[N],resA,resB;
double res = -1.0;
int main()
{
#define Off true
if(Off)
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
}
//Read input
cin >> n >> m >> a >> b;
REP(i,0,n,1)
scanf("%d",&y[i]);
REP(i,0,m,1)
scanf("%d",&y_[i]);
REP(i,0,m,1)
scanf("%d",&l[i]);
//process
double temp = 0.0, ytemp, val;
int d = b - a;
REP(i,0,m,1)
{
ytemp = ((double)a / b) * y_[i];
//cout << "ytemp = " << ytemp << endl;
int pos = lower_bound(y, y + n, ytemp) - y;
REP(j, max(0, pos - 1), min(n - 1, pos + 1) + 1,1)
{
val = sqrt((double)(SQR((LL)y[j]) + SQR((LL)a)));
val += sqrt((double)(SQR((LL)d) + SQR((LL)(y_[i] - y[j]))));
val += l[i];
if(res == -1.0 || res > val)
{
res = val;
resA = j;
resB = i;
}
}
}
cout << resA + 1 << " " << resB + 1 << endl;
return 0;
}
Không có nhận xét nào:
Đăng nhận xét