Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <vector>
- #define task "TACKE"
- using namespace std;
- using ll = long long;
- using ld = long double;
- const int N = 1e3 + 2;
- int n, k, m, v;
- const ll Inf = 1e18;
- ll dp[N][N][2];
- ll a[N];
- vector<int> pos[N], s;
- void Read(){
- cin >> n >> k;
- for(int i = 1; i <= n; ++i)
- cin >> a[i];
- for(int i = 1; i <= n; ++i)
- cin >> v,
- pos[v].push_back(i),
- s.push_back(v);
- sort(s.begin(), s.end());
- s.resize(unique(s.begin(), s.end()) - s.begin());
- for(int i = 0; i < s.size(); ++i)
- swap(pos[i + 1], pos[s[i]]);
- m = s.size();
- for(int i = 1; i <= m; ++i)
- sort(pos[i].begin(), pos[i].end(), [&](int &x, int &y){return a[x] < a[y];});
- }
- void Destroy(){
- for(int i = 1; i <= m; ++i)
- pos[i].clear();
- s.clear();
- }
- /// f(i, j, t) : đến màu thứ i đã bắt được chính xác j con vịt và (t == 1 ? đã bắt con cuối : chưa bắt con cuối)
- /// TH1 : Không chọn màu i : f(i, j, t) = f(i - 1, j, t)
- /// TH2 : Chọn màu i:
- /// a - Không chọn i làm cuối : f(i, j, t) = min(f(i - 1, j - h, t) + 2 * a[pos[i][h - 1]]) với mọi h
- /// b - Chọn i làm cuối : f(i, j, 1) = min(f(i - 1, j - h, 0) + a[pos[i][h - 1]]) với mọi h
- ll &f(int x, int y, int z){
- return dp[x][y][z];
- }
- void Solve(){
- fill_n(&dp[0][0][0], 2 * N * N, Inf);
- dp[0][0][0] = 0;
- for(int i = 1; i <= m; ++i)
- for(int j = 0; j <= k; ++j){
- /// TH1
- f(i, j, 0) = f(i - 1, j, 0);
- f(i, j, 1) = f(i - 1, j, 1);
- ///TH2
- for(int h = 1; h <= min(j, (int)pos[i].size()); ++h){
- //a
- f(i, j, 0) = min(f(i, j, 0), f(i - 1, j - h, 0) + 2 * a[pos[i][h - 1]]);
- f(i, j, 1) = min(f(i, j, 1), f(i - 1, j - h, 1) + 2 * a[pos[i][h - 1]]);
- //b
- f(i, j, 1) = min(f(i, j, 1), f(i - 1, j - h, 0) + a[pos[i][h - 1]]);
- }
- }
- cout << f(m, k, 1) << "\n";
- }
- int32_t main(){
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0); if(fopen(task".INP", "r"))
- freopen(task".INP", "r", stdin),
- freopen(task".ANS", "w", stdout);
- int t;
- cin >> t;
- while(t--)
- Read(),
- Solve(),
- Destroy();
- }
Add Comment
Please, Sign In to add comment