#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rrep(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define all(x) (x).begin(), (x).end()
#define sz(x) int(x.size())
#define get_unique(x) x.erase(unique(all(x)), x.end());
typedef long long ll;
typedef complex<double> Complex;
const int INF = 1e9;
const ll MOD = 998244353;
const ll LINF = 1e18;
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 (b < a) {
a = b;
return 1;
}
return 0;
}
template <class T>
vector<T> make_vec(size_t a) {
return vector<T>(a);
}
template <class T, class... Ts>
auto make_vec(size_t a, Ts... ts) {
return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}
template <typename T>
ostream& operator<<(ostream& os, vector<T> v) {
for (int i = 0; i < sz(v); i++) {
os << v[i];
if (i < sz(v) - 1) os << " ";
}
return os;
}
template <typename T>
vector<T> Dijkstra(int s, vector<vector<pair<int, T>>>& g) {
priority_queue<pair<T, int>, vector<pair<T, int>>, greater<pair<T, int>>>
que;
int n = sz(g);
vector<T> d(n);
rep(i, n) d[i] = LINF;
d[s] = 0;
que.push(make_pair(0LL, s));
while (!que.empty()) {
pair<T, int> p = que.top();
que.pop();
int v = p.second;
if (d[v] < p.first) continue;
for (auto e : g[v]) {
if (chmin(d[e.first], d[v] + e.second)) {
que.push(make_pair(d[e.first], e.first));
}
}
}
return d;
}
int main() {
int n, m;
ll k;
cin >> n >> m >> k;
vector<int> a(m), b(m);
vector<ll> c(m), d(m);
rep(i, m) {
cin >> a[i] >> b[i] >> c[i] >> d[i];
a[i]--;
b[i]--;
}
ll ok = LINF, ng = 0, mid;
while (ok - ng > 1) {
mid = (ok + ng) / 2;
vector<vector<pair<int, ll>>> g(n);
rep(i, m) {
if (d[i] <= mid) {
g[a[i]].emplace_back(b[i], c[i]);
g[b[i]].emplace_back(a[i], c[i]);
}
}
(Dijkstra(0, g)[n - 1] <= k ? ok : ng) = mid;
}
cout << (ok == LINF ? -1 : ok) << endl;
}
提出
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rrep(i, n) for (int i = (int)(n - 1); i >= 0; i--)
#define all(x) (x).begin(), (x).end()
#define sz(x) int(x.size())
#define get_unique(x) x.erase(unique(all(x)), x.end());
typedef long long ll;
typedef complex<double> Complex;
const int INF = 1e9;
const ll MOD = 1e9 + 7;
const ll LINF = 1e18;
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 (b < a) {
a = b;
return 1;
}
return 0;
}
template <class T>
vector<T> make_vec(size_t a) {
return vector<T>(a);
}
template <class T, class... Ts>
auto make_vec(size_t a, Ts... ts) {
return vector<decltype(make_vec<T>(ts...))>(a, make_vec<T>(ts...));
}
template <typename T>
ostream& operator<<(ostream& os, vector<T> v) {
for (int i = 0; i < sz(v); i++) {
os << v[i];
if (i < sz(v) - 1) os << " ";
}
return os;
}
int h, w;
int id(int i, int j) {
return i * w + j;
}
int main() {
int t;
cin >> t;
vector<set<int>> lr, ud;
for (int _ = 1; _ <= t; _++) {
cout << "Case #" << _ << ": ";
cin >> h >> w;
int n = h * w;
vector<ll> v(n);
ll tot = 0;
rep(i, n) cin >> v[i], tot += v[i];
lr.clear();
ud.clear();
lr.resize(h);
ud.resize(w);
rep(i, h) rep(j, w) {
lr[i].insert(id(i, j));
ud[j].insert(id(i, j));
}
rep(i, h) {
lr[i].insert(-1);
lr[i].insert(INF);
}
rep(j, w) {
ud[j].insert(-1);
ud[j].insert(INF);
}
set<int> q, tmp;
vector<int> el;
rep(i, n) q.insert(i);
ll ans = tot;
while (1) {
el.clear();
tmp.clear();
for (int id : q) {
int i = id / w, j = id % w;
ll sum = 0;
auto itr1 = lr[i].upper_bound(id);
auto itr2 = lr[i].lower_bound(id);
auto itr3 = ud[j].upper_bound(id);
auto itr4 = ud[j].lower_bound(id);
if (*itr1 != INF) sum += v[id] - v[*itr1];
if (*(--itr2) != -1) sum += v[id] - v[*itr2];
if (*itr3 != INF) sum += v[id] - v[*itr3];
if (*(--itr4) != -1) sum += v[id] - v[*itr4];
if (sum < 0) {
if (*itr1 != INF) tmp.insert(*itr1);
if (*itr2 != -1) tmp.insert(*itr2);
if (*itr3 != INF) tmp.insert(*itr3);
if (*itr4 != -1) tmp.insert(*itr4);
el.push_back(id);
tot -= v[id];
}
}
for (int id : el) {
int i = id / w, j = id % w;
lr[i].erase(id);
ud[j].erase(id);
tmp.erase(id);
}
q = tmp;
if (q.empty()) break;
ans += tot;
}
cout << ans << endl;
}
}
ABC162 A - Lucky 7
問題
提出
問題
提出
ABC162 C - Sum of gcd of Tuples (Easy)
問題
std::gcd 便利〜
提出
ABC162 D - RGB Triplets
問題
('R', 'G', 'B'), ('R', 'B', 'G'), ('G', 'R', 'B'), ('G', 'B', 'R'), ('B', 'R', 'G'), ('B', 'G', 'R') ということなのでこれらを全部数えた。どう考えても ('R'の個数) × ('G'の個数) × ('B'の個数) でよかった……。
の方が数えやすいので、そっちを数えてあとで引く。
提出
ABC162 E - Sum of gcd of Tuples (Hard)
問題
はい来たいつものやつ!!「gcd が
になるような数列は何通りあるか?」を
について考えるやつ。
gcd が
になるためには、数列の全要素が
の倍数であることが必要。一方、全要素が
の倍数だと gcd は
ではなく
になってしまうし、
の場合も同様。つまり、「
gcd がGとなるような数列の数 」とすると、
。これを上から順番に計算して、足す。
F解けなかったので明日やります
提出
Codeforces Round #633 (Div. 1) A - Powered Addition
問題
問題文を正しく理解するのに30分くらいかかった、英語難しい…。前から順番に合わせていけばOK。
提出
Codeforces Round #633 (Div. 1) B - Edge Weight Assignment
問題
- minimum は割と簡単で、距離が奇数になる葉のペアがあれば
、なければ
(これは示せる)。適当に根を決めて深さを見た。
- maximum はかなり悩んだ。距離が
のところは同じ重みじゃないとダメで、あとは全部違う重みを割り振ることができる(これは証明:AC)。
提出
コメント
コンテストいっぱいある日はやっぱり楽しい。冷えて悲しいのを差し引いてもね。