結果
| 問題 |
No.2404 Vertical Throw Up
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-08-04 22:33:04 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,255 bytes |
| コンパイル時間 | 4,231 ms |
| コンパイル使用メモリ | 254,436 KB |
| 最終ジャッジ日時 | 2025-02-15 23:00:29 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | WA * 30 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
struct ConvexHullTrick{
std::deque<std::pair<long long, long long> > dq; //(傾き、切片)
void add(long long a, long long b){
std::pair<long long, long long> p0=std::make_pair(a, b);
while(dq.size()>=2){
int sz=dq.size();
std::pair<long long, long long> p1=dq[sz-1];
std::pair<long long, long long> p2=dq[sz-2];
if((p0.second-p1.second)*(p0.first-p2.first) > (p0.second-p2.second)*(p0.first-p1.first))break;//交点のx座標を比較
dq.pop_back();
}
dq.push_back(p0);
}
long long query(long long x){
while(dq.size()>=2){
long long v1=dq[0].first*x+dq[0].second;
long long v2=dq[1].first*x+dq[1].second;
if(v1>=v2)break;
dq.pop_front();
}
return dq[0].first*x+dq[0].second;
}
};
int main() {
long long a;
cin >> a;
int Q;
cin >> Q;
ConvexHullTrick cht;
while (Q--){
int T;
cin >> T;
if (T == 1){
long long s, t;
cin >> s >> t;
long long b = a * (t * t - s * s);
b /= t - s;
long long c = s * (a * s - b);
cht.add(b, c);
}
if (T == 2){
long long t;
cin >> t;
long long c = cht.query(t) - a * t * t;
cout << max(0LL, c) << '\n';
}
}
}