Untitled
unknown
c_cpp
a year ago
2.3 kB
13
Indexable
/// I am snatchin chains and burnin' tattoos
#include <bits/stdc++.h>
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
#define pb push_back
#define F first
#define S second
#define f(i, a, b) for (int i = a; i < b; i++)
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define sz(x) (int)(x).size()
#define mp(x, y) make_pair(x, y)
#define popCnt(x) (__builtin_popcountll(x))
#define int ll
using ll = long long;
using ii = pair<int, int>;
using ull = unsigned long long;
const int N = 1e6 + 5, A = 26 * 26, LG = 19, MOD = (119 << 23) + 1;
const long double PI = acos(-1);
const long double EPS = 1e-7;
vector<vector<int>> go[N];
int dp[205][205];
int cost[205][205], del[205];
int n, m;
int a[205];
int solve(int index, int prv) {
if(index == n) return 0;
int &ret = dp[index][prv];
if(~ret) return ret;
ret = 1e17;
if(a[index] >= prv) ret = min(ret, solve(index + 1, a[index]));
ret = min(ret, solve(index + 1, prv) + del[a[index]]);
f(i,1,201) if(i >= prv)ret = min(ret, solve(index+1,i)+cost[a[index]][i]);
f(i,1,201) ret = min(ret, solve(index+1,prv)+cost[a[index]][i]+del[i]);
return ret;
}
void doWork() {
memset(dp,-1,sizeof dp);
cin >> n >> m;
f(i,0,n) cin >> a[i];
f(i,0,205)
f(j,0,205) cost[i][j] = 1e17;
f(i,0,205)cost[i][i] = 0, del[i]=1e17;
f(i,0,m) {
int tp;
cin >> tp;
if(tp == 1) {
int x, y, c;
cin >> x >> y >> c;
cost[x][y] = min(cost[x][y], c);
} else {
int x, c;
cin >> x >> c;
del[x] = min(del[x], c);
}
}
f(k,0,205)
f(i,0,205)
f(j,0,205)cost[i][j]=min(cost[i][j],cost[i][k]+cost[k][j]);
int ans = solve(0,0);
if(ans > 1e16) cout << "-1\n";
else cout << ans << "\n";
}
int32_t main() {
#ifdef LOCAL
// freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#else
ios_base::sync_with_stdio(0);
cin.tie(0);
#endif
int t = 1;
// cin >> t;
while (t--) {
doWork();
}
}Editor is loading...
Leave a Comment