結果
| 問題 |
No.2321 Continuous Flip
|
| コンテスト | |
| ユーザー |
amentorimaru
|
| 提出日時 | 2023-02-15 16:40:27 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 390 ms / 2,000 ms |
| コード長 | 2,530 bytes |
| コンパイル時間 | 1,208 ms |
| コンパイル使用メモリ | 134,176 KB |
| 最終ジャッジ日時 | 2025-02-10 15:40:26 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 30 |
ソースコード
#define _USE_MATH_DEFINES
#include<stdio.h>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
#include<string>
#include <cassert>
#include <numeric>
#include <unordered_map>
#include <unordered_set>
#include <queue>
#include <math.h>
#include <climits>
#include <set>
#include <map>
#include <list>
#include <random>
#include <iterator>
#include <bitset>
using namespace std;
using ll = long long;
#define REP(i, n) for(ll i=0; i<(n);i++)
#define VL vector<ll>
template<typename T = ll>
vector<T> read(size_t n) {
vector<T> ts(n);
for (size_t i = 0; i < n; i++) cin >> ts[i];
return ts;
}
template<typename TV, const ll N> void read_tuple_impl(TV&) {}
template<typename TV, const ll N, typename Head, typename... Tail>
void read_tuple_impl(TV& ts) {
get<N>(ts).emplace_back(*(istream_iterator<Head>(cin)));
read_tuple_impl<TV, N + 1, Tail...>(ts);
}
template<typename... Ts> decltype(auto) read_tuple(size_t n) {
tuple<vector<Ts>...> ts;
for (size_t i = 0; i < n; i++) read_tuple_impl<decltype(ts), 0, Ts...>(ts);
return ts;
}
class Dijkstra {
public:
Dijkstra(ll n) {
size = n;
edges.resize(n);
dist0.resize(n);
rev.resize(n);
}
void addEdge(ll from, ll to, ll cost = 0) {
edges[from].push_back({ to,cost });
}
void SetDefaultDist(ll s) {
dist0.assign(size, LLONG_MAX);
rev.assign(size, -1);
dist0[s] = 0;
que.push(P(0, s));
}
void CalcDist() {
while (!que.empty()) {
P p = que.top();
que.pop();
ll v = p.second;
if (dist0[v] < p.first)
continue;
for (ll i = 0; i < edges[v].size(); i++) {
edge e = edges[v][i];
if (dist0[e.to] > dist0[v] + e.cost) {
dist0[e.to] = dist0[v] + e.cost;
rev[e.to] = v;
que.push(P(dist0[e.to], e.to));
}
}
}
}
void GetDist(ll s) {
SetDefaultDist(s);
CalcDist();
}
ll size; // 点数
struct edge { ll to, cost; };
typedef pair<ll, ll> P;
priority_queue<P, vector<P>, greater<P>> que;
vector<vector<edge>> edges;
vector<ll> dist0;
vector<ll> rev;
};
int main() {
ll n, m, c;
cin >> n >> m >> c;
VL a = read(n);
auto [l, r] = read_tuple<ll, ll>(m);
ll sumA = 0;
REP(i, n) sumA += a[i];
Dijkstra dj(n + 1);
REP(i, n) {
dj.addEdge(i, i + 1, a[i]);
dj.addEdge(i + 1, i, a[i]);
}
REP(i, m) {
dj.addEdge(l[i] - 1, r[i], c);
dj.addEdge(r[i], l[i] - 1, c);
}
dj.GetDist(0);
cout << sumA - dj.dist0[n] << "\n";
return 0;
}
amentorimaru