Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- #define ILoveSonodaYu ios_base::sync_with_stdio(0);
- #define VeryMuch cin.tie(0);
- using namespace std;
- const int N = 2e3+5, INF = 1e9;
- long double L, W, d[2*N][N];
- int n, m, a[N], b[N];
- inline void read(){
- cin >> L >> W;
- cin >> n;
- for(int i = 1; i <= n; ++i)
- cin >> a[i];
- cin >> m;
- for(int i = 1; i <= m; ++i)
- cin >> b[i];
- }
- long double perimeter(int l1, int r1, int l2, int r2){
- return (a[r1]-a[l1])+(b[r2]-b[l2])+hypotl(W,a[l1]-b[l2])+hypotl(W,a[r1]-b[r2]);
- }
- inline void ToLoveMyYu(){
- for(int i = 2; i <= n+m; ++i)
- for(int j = 1; j <= min(n,i-1); ++j)
- d[i][j] = a[j]+b[i-j]-hypotl(a[j]-b[i-j],W);
- }
- struct Yu{
- long double smile = -INF;
- void give_yummy(long double x){
- smile = max(smile,x);
- }
- long double Yusmile(){
- return smile;
- }
- void bathe(){
- smile = -INF;
- }
- };
- bool check(int S){
- Yu best;
- for(int r1 = 1; r1 <= n; ++r1){
- best.bathe();
- for(int r2 = 1; r2 <= m; ++r2){
- int x = r1+r2-S;
- if(x<0||x>r1+r2) continue;
- if(x-r2>0 && x-r2<=n) best.give_yummy(d[x][x-r2]);
- if(x-r2<=0) best.give_yummy(-hypotl(W,a[0]-b[0]));
- if(best.Yusmile()!=-INF&&a[r1]+b[r2]+hypotl(W,a[r1]-b[r2])-best.Yusmile()<=L) return true;
- }
- }
- return false;
- }
- inline void solve(){
- int l = 0, r = n+m, md;
- while(r-l>1){
- md = (l+r)/2;
- if(check(md)) l = md;
- else r = md;
- }
- cout << l;
- }
- int main(){
- ILoveSonodaYu VeryMuch
- read();
- ToLoveMyYu();
- solve();
- check(5);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement