- P150's solution
-
题解 P150
- @ 2026-2-7 21:38:40
使用状态压缩动态规划来找到最大美观度,状态 mask 表示已使用的位置,dp[mask] 记录当前最大美观度,遍历所有可能的位置分配,更新状态转移,最终得到最大美观度。
AC code:
#include <bits/stdc++.h>
using namespace std;
void pre(const vector<int> &a, unordered_map<int, vector<int>> &pos) {
for (int i = 0; i < a.size(); ++i) {
pos[a[i]].push_back(i);
}
}
bool issub(const vector<int> &a, const vector<int> &b, const unordered_map<int, vector<int>> &pos) {
int pinx = -1;
for (int num : b) {
const auto &poss = pos.at(num);
auto it = lower_bound(poss.begin(), poss.end(), pinx + 1);
if (it == poss.end()) {
return false;
}
pinx = *it;
}
return true;
}
int main() {
freopen("ds.in", "r", stdin);
freopen("ds.out", "w", stdout);
int n, q;
cin >> n >> q;
vector<int> a(n);
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
unordered_map<int, vector<int>> pos;
pre(a, pos);
for (int i = 0; i < q; ++i) {
int op;
cin >> op;
if (op == 1) {
int l, r, v;
cin >> l >> r >> v;
for (int j = l - 1; j < r; ++j) {
a[j] = v;
}
pos.clear();
pre(a, pos);
} else {
int m;
cin >> m;
vector<int> b;
for (int j = 0; j < m; ++j) {
int x, y;
cin >> x >> y;
for (int k = 0; k < y; ++k) {
b.push_back(x);
}
}
if (issub(a, b, pos)) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
}
}
return 0;
}