結果
問題 | No.35 タイパー高橋 |
ユーザー | tetsuyamin |
提出日時 | 2019-08-16 02:03:17 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 2 ms / 5,000 ms |
コード長 | 8,686 bytes |
コンパイル時間 | 2,195 ms |
コンパイル使用メモリ | 185,992 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-09-19 15:57:10 |
合計ジャッジ時間 | 2,333 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
ソースコード
#include <bits/stdc++.h> #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define rep(i, s, N) for (ll i{s}; i < (N); i++) #define rem(i, N, s) for (ll i{N}; i > (s); i--) #define debug(x) cerr << #x << ": " << x << '\n' #define put ""; cout const int MOD = (int)1e9 + 7; const long double pi = 3.141592653589793238462643383279; using namespace std; using ll = long long; using ld = long double; using str = string; using wstr = wstring; const string rt = "\n", sp = " "; /* GCD */ template <typename M, typename N> constexpr common_type_t<M, N> gcd(M a, N b) { return b != 0 ? gcd(b, a % b) : a; } /* LCM */ template <typename M, typename N> constexpr common_type_t<M, N> lcm(M a, N b) { return a * b / gcd(a, b); } /* UNIONFIND */ template <typename T> struct UnionFind { vector<T> par; UnionFind(T n) : par(n, -1) {} void init(T n) { par.assign(n, -1); } T root(T x) { if (par[x] < 0) return x; else return par[x] = root(par[x]); } bool issame(T x, T y) { return root(x) == root(y); } bool merge(T x, T y) { x = root(x); y = root(y); if (x == y) return false; if (par[x] > par[y]) swap(x, y); par[x] += par[y]; par[y] = x; return true; } int size(int x) { return -par[root(x)]; } }; /* COMB */ auto comb(ll N){ vector<vector<ll>> v(N+1,vector<ll>(N+1)); for(int i = 0;i <v.size(); i++){ v[i][0]=1; v[i][i]=1; } for(int k = 1;k <v.size();k++){ for(int j = 1;j<k;j++){ v[k][j]=(v[k-1][j-1]+v[k-1][j]); } } return v; } auto comb(ll N, ll n){ vector<vector<ll>> v(max(N+1,n+1),vector<ll>(max(N+1,n+1))); for(int i = 0;i <v.size(); i++){ v[i][0]=1; v[i][i]=1; } for(int k = 1;k <v.size();k++){ for(int j = 1;j<k;j++){ v[k][j]=(v[k-1][j-1]+v[k-1][j]); } } return v[N][n]; } /* COMB % MOD */ template <typename T> ll combpm(T N_, T C_) { const int NUM_ = 400001; static ll fact[NUM_ + 1], factr[NUM_ + 1], inv[NUM_ + 1]; if (fact[0] == 0) { inv[1] = fact[0] = factr[0] = 1; for (int i = 2; i <= NUM_; ++i) inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD; for (int i = 1; i <= NUM_; ++i) fact[i] = fact[i - 1] * i % MOD, factr[i] = factr[i - 1] * inv[i] % MOD; } if (C_ < 0 || C_ > N_) return 0; return factr[C_] * fact[N_] % MOD * factr[N_ - C_] % MOD; } /* MAKE VECTOR */ template <class T> constexpr vector<T> mvec(size_t a) { return vector<T>(a); } template <class T, class... Ts> auto mvec(size_t a, Ts... ts) { return vector<decltype(mvec<T>(ts...))>(a, mvec<T>(ts...)); } /* MAKE DEQUE */ template <class T> constexpr deque<T> mdeq(size_t a) { return deque<T>(a); } template <class T, class... Ts> auto mdeq(size_t a, Ts... ts) { return deque<decltype(mdeq<T>(ts...))>(a, mdeq<T>(ts...)); } /* TEST */ void test(ll n) { cout << "test" << n << endl; } /* PRECISION */ void fixsp(ll n) { cout << fixed << setprecision(n); } void defsp(ll n) { cout << defaultfloat << setprecision(n); } /* WEIGHTENED UNIONFIND */ struct WUnionFind { vector<int> par; vector<int> rank; WUnionFind(int n = 1) { init(n); } void init(int n = 1) { par.resize(n); rank.resize(n); for (int i = 0; i < n; ++i) par[i] = i, rank[i] = 0; } int root(int x) { if (par[x] == x) { return x; } else { int r = root(par[x]); return par[x] = r; } } bool issame(int x, int y) { return root(x) == root(y); } bool merge(int x, int y) { x = root(x); y = root(y); if (x == y) return false; if (rank[x] < rank[y]) swap(x, y); if (rank[x] == rank[y]) ++rank[x]; par[y] = x; return true; } }; /* DIVISOR */ deque<ll> divisor(ll n) { deque<ll> ret; for (ll i = 1; i * i <= n; i++) { if (n % i == 0) { ret.push_back(i); if (i * i != n) ret.push_back(n / i); } } sort(begin(ret), end(ret)); return (ret); } /* MODE */ template <typename T> auto mode(T data) { if (data.size() == 1) return *begin(data); sort(begin(data), end(data)); typename decltype(data)::value_type mode{}; size_t n{}, count{1}; for (auto iter = adjacent_find(begin(data), end(data)), last = end(data), next = end(data); iter != last;) { next = upper_bound(iter, last, *iter); count = distance(iter, next); if (n < count) n = count, mode = *iter; iter = adjacent_find(next, last); } return mode; } /* MEDIAN */ template <typename T> auto median(T data) { sort(begin(data), end(data)); size_t median_index = data.size() / 2; return (data.size() % 2 == 0 ? static_cast<double>(data[median_index] + data[median_index - 1]) / 2 : data[median_index]); } /* INT POW */ template <typename T> ll multi(T a, T b) { ll ans{1}; for (int i{}; i < b; i++) ans *= a; return ans; } /* INF */ template <typename T> constexpr T inf() { return numeric_limits<T>::max(); } /* FASTER IO */ void fastio() { ios::sync_with_stdio(false); cin.tie(NULL); } /* MIN COST FLOW */ template <typename flow_t, typename cost_t> struct PrimalDual { const cost_t INF; struct edge { int to; flow_t cap; cost_t cost; int rev; bool isrev; }; vector<vector<edge>> graph; vector<cost_t> potential, min_cost; vector<int> prevv, preve; PrimalDual(int V) : graph(V), INF(numeric_limits<cost_t>::max()) {} void add_edge(int from, int to, flow_t cap, cost_t cost) { graph[from].emplace_back((edge){to, cap, cost, (int)graph[to].size(), false}); graph[to].emplace_back((edge){from, 0, -cost, (int)graph[from].size() - 1, true}); } cost_t min_cost_flow(int s, int t, flow_t f) { int V = (int)graph.size(); cost_t ret = 0; using Pi = pair<cost_t, int>; priority_queue<Pi, vector<Pi>, greater<Pi>> que; potential.assign(V, 0); preve.assign(V, -1); prevv.assign(V, -1); while (f > 0) { min_cost.assign(V, INF); que.emplace(0, s); min_cost[s] = 0; while (!que.empty()) { Pi p = que.top(); que.pop(); if (min_cost[p.second] < p.first) continue; for (int i = 0; i < graph[p.second].size(); i++) { edge &e = graph[p.second][i]; cost_t nextCost = min_cost[p.second] + e.cost + potential[p.second] - potential[e.to]; if (e.cap > 0 && min_cost[e.to] > nextCost) { min_cost[e.to] = nextCost; prevv[e.to] = p.second, preve[e.to] = i; que.emplace(min_cost[e.to], e.to); } } } if (min_cost[t] == INF) return -1; for (int v = 0; v < V; v++) potential[v] += min_cost[v]; flow_t addflow = f; for (int v = t; v != s; v = prevv[v]) { addflow = min(addflow, graph[prevv[v]][preve[v]].cap); } f -= addflow; ret += addflow * potential[t]; for (int v = t; v != s; v = prevv[v]) { edge &e = graph[prevv[v]][preve[v]]; e.cap -= addflow; graph[v][e.rev].cap += addflow; } } return ret; } void output() { for (int i = 0; i < graph.size(); i++) { for (auto &e : graph[i]) { if (e.isrev) continue; auto &rev_e = graph[e.to][e.rev]; cout << i << "->" << e.to << " (flow: " << rev_e.cap << "/" << rev_e.cap + e.cap << ")" << endl; } } } }; /* BELLMANFORD */ template <typename T> struct edge { int from, to; T cost; edge(int to, T cost) : from(-1), to(to), cost(cost) {} edge(int from, int to, T cost) : from(from), to(to), cost(cost) {} explicit operator int() const { return to; } }; template <typename T> vector<T> BellmanFord(int s, int V, vector<edge<T>> &G) { vector<T> d(V, inf<T>()); vector<bool> neg(V); d[s] = 0; for (int i = 0; i < V - 1; ++i) { for (auto &&e : G) { if (d[e.from] == inf<T>()) continue; d[e.to] = min(d[e.to], d[e.from] + e.cost); } } for (int i = 0; i < V; ++i) { for (auto &&e : G) { if (d[e.from] == inf<T>()) continue; if (d[e.to] > d[e.from] + e.cost) { d[e.to] = d[e.from] + e.cost; neg[e.to] = 1; } if (neg[e.from]) neg[e.to] = 1; } } for (int i = 0; i < V; i++) { if (neg[i]) d[i] = -inf<ll>(); } return d; } /* NUITA.INC & KYOTO UNIVERSITY */ /* LAST EDITED ON 8.16.2019 */ /* CODE STARTS FROM HERE */ int main(){ fastio(); ll N; cin >> N; ll ok{}, ng{}; rep(i,0,N){ ll T; str S; cin >> T >> S; ok += min<ll>(S.size(), T*12/1000); ng += max<ll>(0,S.size()-T*12/1000); } cout << ok << sp << ng << rt; }