結果

問題 No.703 ゴミ拾い Easy
ユーザー ふっぴーふっぴー
提出日時 2018-06-16 13:44:35
言語 C++14
(gcc 13.2.0 + boost 1.83.0)
結果
RE  
実行時間 -
コード長 4,707 bytes
コンパイル時間 2,108 ms
コンパイル使用メモリ 183,572 KB
実行使用メモリ 22,088 KB
最終ジャッジ日時 2023-09-13 06:04:46
合計ジャッジ時間 13,120 ms
ジャッジサーバーID
(参考情報)
judge14 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
4,376 KB
testcase_01 AC 2 ms
4,376 KB
testcase_02 AC 1 ms
4,376 KB
testcase_03 AC 2 ms
4,376 KB
testcase_04 AC 2 ms
4,380 KB
testcase_05 RE -
testcase_06 AC 1 ms
4,376 KB
testcase_07 AC 2 ms
4,380 KB
testcase_08 RE -
testcase_09 RE -
testcase_10 AC 2 ms
4,380 KB
testcase_11 RE -
testcase_12 AC 2 ms
4,380 KB
testcase_13 RE -
testcase_14 AC 3 ms
4,384 KB
testcase_15 RE -
testcase_16 AC 4 ms
4,384 KB
testcase_17 RE -
testcase_18 RE -
testcase_19 AC 4 ms
4,380 KB
testcase_20 AC 3 ms
4,376 KB
testcase_21 RE -
testcase_22 AC 3 ms
4,380 KB
testcase_23 AC 3 ms
4,376 KB
testcase_24 AC 376 ms
22,088 KB
testcase_25 AC 377 ms
22,076 KB
testcase_26 AC 377 ms
21,844 KB
testcase_27 AC 376 ms
22,012 KB
testcase_28 AC 381 ms
21,912 KB
testcase_29 AC 378 ms
22,076 KB
testcase_30 AC 378 ms
22,020 KB
testcase_31 AC 380 ms
21,912 KB
testcase_32 AC 376 ms
21,912 KB
testcase_33 AC 376 ms
21,988 KB
testcase_34 AC 242 ms
21,812 KB
testcase_35 AC 243 ms
21,704 KB
testcase_36 AC 248 ms
21,708 KB
testcase_37 AC 243 ms
21,652 KB
testcase_38 AC 244 ms
21,944 KB
testcase_39 AC 243 ms
21,772 KB
testcase_40 AC 242 ms
21,648 KB
testcase_41 AC 241 ms
21,644 KB
testcase_42 AC 241 ms
21,692 KB
testcase_43 AC 242 ms
21,760 KB
testcase_44 AC 2 ms
4,380 KB
testcase_45 RE -
testcase_46 AC 292 ms
21,696 KB
testcase_47 AC 287 ms
21,700 KB
testcase_48 AC 3 ms
4,380 KB
testcase_49 RE -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include "bits/stdc++.h"

using namespace std;

#define DEBUG(x) cerr<<#x<<": "<<x<<endl;
#define DEBUG_VEC(v) cerr<<#v<<":";for(int i=0;i<v.size();i++) cerr<<" "<<v[i]; cerr<<endl

//typedef long long ll;
typedef __int128 ll;
#define vi vector<int>
#define vl vector<ll>
#define vii vector< vector<int> >
#define vll vector< vector<ll> >
#define vs vector<string>
#define pii pair<int,int>
#define pis pair<int,string>
#define psi pair<string,int>
#define pll pair<ll,ll>
template<class S, class T> pair<S, T> operator+(const pair<S, T> &s, const pair<S, T> &t) { return pair<S, T>(s.first + t.first, s.second + t.second); }
template<class S, class T> pair<S, T> operator-(const pair<S, T> &s, const pair<S, T> &t) { return pair<S, T>(s.first - t.first, s.second - t.second); }
template<class S, class T> ostream& operator<<(ostream& os, pair<S, T> p) { os << "(" << p.first << ", " << p.second << ")"; return os; }
#define X first
#define Y second
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define rep1(i,n) for(ll i=1;i<=(ll)(n);i++)
#define rrep(i,n) for(ll i=(ll)(n)-1;i>=0;i--)
#define rrep1(i,n) for(ll i=(ll)(n);i>0;i--)
#define REP(i,a,b) for(ll i=(ll)a;i<(ll)b;i++)
#define in(x, a, b) (a <= x && x < b)
#define all(c) c.begin(),c.end()
template<class T> bool chmax(T &a, const T &b) { if (a<b) { a = b; return 1; } return 0; }
template<class T> bool chmin(T &a, const T &b) { if (a>b) { a = b; return 1; } return 0; }
const ll inf = 1000000001;
const ll INF = 2e18;
const ll MOD = 1000000007;
const double pi = 3.14159265358979323846;
#define Sp(p) cout<<setprecision(15)<< fixed<<p<<endl;
int dx[4] = { 1,0, -1,0 }, dy[4] = { 0,1,0,-1 };
int dx2[8] = { 1,1,0,-1,-1,-1,0,1 }, dy2[8] = { 0,1,1,1,0,-1,-1,-1 };
#define fio() cin.tie(0); ios::sync_with_stdio(false);


//最小値クエリ
//INFの値によってはすぐオーバーフローするので注意(|ab| < LLONG_MAX/4)
//非順序add非順序query
//http://d.hatena.ne.jp/sune2/20140310/1394440369
struct CHT2 {
	CHT2() {
		// 番兵
		S.insert({ L(INF,0), L(-INF,0) });
		C.insert(cp(L(INF, 0), L(-INF, 0)));
	}
	// for debug
	void print() {
		cout << "S : "; for (auto it : S) printf("(%lld,%lld)", it.a, it.b); puts("");
		cout << "C : "; for (auto it : C) printf("(%lld,%lld)", it.n, it.d); puts("");
	}
	// |ab| < LLONG_MAX/4 ???
	void add(ll a, ll b) {
		const L p(a, b);
		It pos = S.insert(p).first;
		if (check(*it_m1(pos), p, *it_p1(pos))) {
			// 直線(a,b)が不要
			S.erase(pos);
			return;
		}
		C.erase(cp(*it_m1(pos), *it_p1(pos)));
		{
			// 右方向の削除
			It it = it_m1(pos);
			while (it != S.begin() && check(*it_m1(it), *it, p)) --it;
			C_erase(it, it_m1(pos));
			S.erase(++it, pos);
			pos = S.find(p);
		}
		{
			// 左方向の削除
			It it = it_p1(pos);
			while (it_p1(it) != S.end() && check(p, *it, *it_p1(it))) ++it;
			C_erase(++pos, it);
			S.erase(pos, it);
			pos = S.find(p);
		}
		C.insert(cp(*it_m1(pos), *pos));
		C.insert(cp(*pos, *it_p1(pos)));
	}
	ll query(ll x) {
		const L &p = (--C.lower_bound(CP(x, 1, L(0, 0))))->p;
		return p.a*x + p.b;
	}

private:

	template<class T> T it_p1(T a) { return ++a; }
	template<class T> T it_m1(T a) { return --a; }
	struct L {
		ll a, b;
		L(ll a, ll b) : a(a), b(b) {}
		bool operator<(const L &rhs) const {
			return a != rhs.a ? a > rhs.a : b < rhs.b;
		}
	};
	struct CP {
		ll n, d;
		L p;
		CP(ll _n, ll _d, const L &p) : n(_n), d(_d), p(p) {
			if (d < 0) { n *= -1; d *= -1; }
		};
		bool operator<(const CP &rhs) const {
			if (n == INF || rhs.n == -INF) return 0;
			if (n == -INF || rhs.n == INF) return 1;
			return n * rhs.d < rhs.n * d;
		}
	};
	set<L> S;
	set<CP> C;

	typedef set<L>::iterator It;

	void C_erase(It a, It b) {
		for (It it = a; it != b; ++it)
			C.erase(cp(*it, *it_p1(it)));
	}
	CP cp(const L &p1, const L &p2) {
		if (p1.a == INF) return CP(-INF, 1, p2);
		if (p2.a == -INF) return CP(INF, 1, p2);
		return CP(p1.b - p2.b, p2.a - p1.a, p2);
	}
	bool check(const L &p1, const L &p2, const L &p3) {
		if (p1.a == p2.a && p1.b <= p2.b) return 1;
		if (p1.a == INF || p3.a == -INF) return 0;
		return (p2.a - p1.a)*(p3.b - p2.b) >= (p2.b - p1.b)*(p3.a - p2.a);
	}
};

int main() {
  int n;
  cin >> n;
  vl a(n + 1), x(n), y(n);
  rep (i, n) {
    long long temp;
    cin >> temp;
    a[i] = temp;
  }
  rep (i, n) {
    long long temp;
    cin >> temp;
    x[i] = temp;

  }
  rep (i, n) {
    long long temp;
    cin >> temp;
    y[i] = temp;
  }

  vl dp(n + 1);
  CHT2 cht;
  cht.add(-2*x[0], dp[0] + x[0]*x[0] + y[0]*y[0]);
  rep1 (i, n) {
    dp[i] = cht.query(a[i - 1]) + a[i - 1] * a[i - 1];
    cht.add(-2*x[i], dp[i] + x[i]*x[i] + y[i]*y[i]);
  }
  //DEBUG_VEC(dp);
  cout << (long long)dp[n] << endl;
}
0