盖世计划--0730--B班训练
A
哈哈,写过的题,看过的性质还能忘,这辈子有了。
一个性质,如果要将
那么最少操作次数为:
理解一下,从左到右考虑,首先
然后简单 DP,考场当然想到了,然后没有上面的东西不会转移,哈哈。设
这样转移要
总复杂度为
B
可持久线段树维护哈希+二分加速比较字典序
C
简单 DP + 根号分治
D
期望题
E
不会写了哥。
当时看了半天,发现自己平衡树就写了个模板题,能写个寄吧,然后鸽了。然后就考了。
等我训完平衡树凯旋归来,薄纱这道题!
OK,我会了。
每个时刻求出前
具体过程:把前
然后考虑怎么 merge 回去。你发现第
#include <bits/stdc++.h>
#define pii std::pair<int, int>
#define mk std::make_pair
#define fi first
#define se second
#define pb push_back
using i64 = long long;
using ull = unsigned long long;
const i64 iinf = 0x3f3f3f3f, linf = 0x3f3f3f3f3f3f3f3f;
const int N = 1e5 + 10;
int n, m, cnt, rt, x, y, z, l1, r1, l, r;
int a[N], b[N];
struct node {
int pri, val, sz, l, r, tg;
} t[N];
int getnode(int a) {t[++cnt] = {rand(), a, 1, 0, 0, 0};return cnt;}
void pushup(int u) {
t[u].sz = t[t[u].l].sz + t[t[u].r].sz + 1;
}
void pd(int u) {
if(!t[u].tg) return;
t[t[u].l].val += t[u].tg, t[t[u].l].tg += t[u].tg;
t[t[u].r].val += t[u].tg, t[t[u].r].tg += t[u].tg;
t[u].tg = 0;
}
void split(int u, int &x, int &y, int k) {
if(!u) {x = y = 0; return;}
pd(u);
if(k <= t[t[u].l].sz) {
y = u;
split(t[u].l, x, t[u].l, k);
} else {
x = u;
split(t[u].r, t[u].r, y, k - t[t[u].l].sz - 1);
}
pushup(u);
}
void splitv(int u, int &x, int &y, int v) {
if(!u) {x = y = 0; return;}
pd(u);
if(t[u].val <= v) {
x = u;
splitv(t[u].r, t[u].r, y, v);
} else {
y = u;
splitv(t[u].l, x, t[u].l, v);
}
pushup(u);
}
int merge(int u, int v) {
if(!u || !v) return u ^ v;
if(t[u].pri < t[v].pri) {
pd(u);
t[u].r = merge(t[u].r, v);
pushup(u);
return u;
} else {
pd(v);
t[v].l = merge(u, t[v].l);
pushup(v);
return v;
}
}
void fake_main() {
std::cin >> n >> m;
int s = 0;
for(int i = 1; i <= n; i++) std::cin >> a[i], s += a[i];
for(int i = 1; i <= m; i++) std::cin >> b[i], s -= b[i];
if(s) {
std::cout << "NO\n";
return;
}
std::sort(b + 1, b + m + 1);
rt = cnt = 0;
for(int i = 1; i <= m; i++) {
rt = merge(rt, getnode(b[i]));
}
bool ok = 1;
for(int i = 1; i <= n; i++) {
split(rt, x, y, m - a[i]);
z = y;
while(t[z].l) pd(z), z = t[z].l;
if(!t[z].val) {
ok = 0;
break;
}
t[y].val--, t[y].tg--;
if(!x) {
rt = y;
continue;
}
z = x;
while(t[z].r) pd(z), z = t[z].r;
int p = t[z].val;
splitv(x, l1, r1, p - 1);
splitv(y, l, r, p - 1);
rt = merge(merge(l1, l), merge(r1, r));
}
std::cout << (ok ? "YES\n" : "NO\n");
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int T;
std::cin >> T;
while(T--) fake_main();
return 0;
}
F
树形 DP + 背包
总结
算是复习了之前的题,
标签:
训练日记
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具