Untitled

 avatar
unknown
c_cpp
a year ago
2.3 kB
8
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