結果
問題 | No.461 三角形はいくつ? |
ユーザー |
|
提出日時 | 2016-12-12 12:08:12 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2,151 ms / 5,000 ms |
コード長 | 2,346 bytes |
コンパイル時間 | 1,114 ms |
コンパイル使用メモリ | 96,480 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-29 15:38:37 |
合計ジャッジ時間 | 33,077 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 41 |
ソースコード
#include <algorithm>#include <bitset>#include <cassert>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <deque>#include <functional>#include <iomanip>#include <iostream>#include <list>#include <map>#include <numeric>#include <queue>#include <set>#include <sstream>#include <stack>#include <string>#include <utility>#include <vector>#define REP(i,s,n) for(int i=(int)(s);i<(int)(n);i++)using namespace std;typedef long long int ll;typedef vector<int> VI;typedef vector<ll> VL;typedef pair<int, int> PI;typedef pair<ll, ll> PL;const ll mod = 1e9 + 7;ll gcd(ll x, ll y) {return y == 0 ? x : gcd(y, x % y);}PL add(PL x, PL y) {PL w = PL(x.first * y.second + x.second * y.first,x.second * y.second);ll g = gcd(w.first, w.second);w.first /= g;w.second /= g;return w;}PL neg(PL x) { return PL(- x.first, x.second); }bool fr_le(PL x, PL y) {return x.first * y.second <= y.first * x.second;}bool fr_lt(PL x, PL y) {return x.first * y.second < y.first * x.second;}int main(void){int n;cin >> n;vector<PL> pool[3];REP(i, 0, 3) {pool[i].push_back(PL(0, 1));}REP(i, 0, n) {int p, a, b;cin >> p >> a >> b;int g = __gcd(a, b);a /= g;b /= g;pool[p].push_back(PL(b, a + b));}if (pool[0].size() > pool[2].size()) {swap(pool[0], pool[2]);}if (pool[1].size() > pool[2].size()) {swap(pool[1], pool[2]);}ll tot = 0;sort(pool[2].begin(), pool[2].end(), fr_lt);REP(i, 0, pool[0].size()) {PL u = pool[0][i];REP(j, 0, pool[1].size()) {PL v = pool[1][j];if (not fr_le(add(u, v), PL(1, 1))) {continue;}PL ma = u;if (fr_le(u, v)) { ma = v; }// find #{x | x + u <= 1 && x + v <= 1 && x + u + v != 1}PL x_ma = add(PL(1, 1), neg(ma));int idx = upper_bound(pool[2].begin(), pool[2].end(), x_ma, fr_lt)- pool[2].begin();tot += idx;PL excl = add(PL(1, 1), neg(add(u, v)));{int idx1 = upper_bound(pool[2].begin(), pool[2].end(), excl, fr_lt)- pool[2].begin();int idx2 = lower_bound(pool[2].begin(), pool[2].end(), excl, fr_lt)- pool[2].begin();assert (idx1 - idx2 <= 1);assert (idx1 >= idx2);tot -= idx1 - idx2;}}}cout << tot << endl;}