牛客多校第二场
把一些没时间写的和没时间想的还有不会做的补一下...
G
题意
给定
题解
对于一个确定的区间组而言,我们往其中添加一个区间,答案显然是不增的
特别的,如果这个区间组中存在着被其完全包含的区间,那么我们就可以无视这个区间
因此,对于包含其余区间的区间而言,要么我们选择无视它,要么选择将其单独归为一组
我们考虑去除这些区间后,剩下的区间,它们互相之间没有包含关系,也就是说,它们的右端点随左端点递增而递增
此时,将左端点相邻的区间分在一组是较为优秀的
设
#include <bits/stdc++.h> using namespace std; #define rep(io, st, ed) for(int io = st; io <= ed; io ++) const int sid = 5e3 + 5; int n, K; struct segment { int l, r; () {} segment(int l_, int r_) : l(l_), r(r_) {} segmentfriend bool operator < (segment a, segment b) { if(a.l != b.l) return a.l < b.l; return a.r < b.r; } } p[sid], t[sid]; int tn, vn; int f[sid][sid], v[sid], q[sid]; int main() { >> n >> K; cin for(int i = 1; i <= n; i ++) cin >> p[i].l >> p[i].r; [n + 1].l = -1; p(p + 1, p + n + 1); sort for(int i = 1, j = i; i <= n; i = j) { while(p[j].l == p[i].l) j ++; [++ tn] = p[i]; pfor(int k = i + 1; k < j; k ++) v[++ vn] = p[k].r - p[k].l; } int tmp = 0; for(int i = 1; i <= tn; i ++) { bool flag = 0; for(int j = 1; j <= tn; j ++) if(i != j && p[i].l <= p[j].l && p[j].r <= p[i].r) = 1; flag if(!flag) t[++ tmp] = p[i]; else v[++ vn] = p[i].r - p[i].l; } = tmp; tn (v + 1, v + vn + 1); sort (i, 0, n) rep(k, 0, K) f[i][k] = (i || k) ? -1e9 : 0; rep for(int k = 1; k <= K; k ++) { int fr = 1, to = 0; [++ to] = 0; qfor(int i = 1; i <= tn; i ++) { while(fr <= to && t[q[fr] + 1].r <= t[i].l) fr ++; #define pre q[fr] if(fr <= to) f[i][k] = f[pre][k - 1] + t[pre + 1].r - t[i].l; while(fr <= to && f[i][k - 1] + t[i + 1].r >= f[q[to]][k - 1] + t[q[to] + 1].r) to --; [++ to] = i; q} } int ans = 0, suf = 0; for(int k = K, lst = vn; k >= 0 && (~lst); k --, lst --) { if(f[tn][k]) ans = max(ans, f[tn][k] + suf); += v[lst]; suf } ("%d\n", ans); printfreturn 0; }
J
题解
sb卡常出题人
L
题意
给定
对于每个点,询问有多少次操作后,这个点的点权比其所有相邻点多大
题解
分块,设
对于小点而言,其邻点只有
对于大点而言,其大点的邻居可以不用考虑
取大点为研究对象,考虑其小点邻居,我们直接分权值,存下其邻居中的小点冠军,当权值增加时,我们把相应的小点冠军给取消
这个题中可以利用权值比较小的条件,权值较大时离散化一下即可...
A
题意
给定序列
题解
这里有一个引理?
- 对于序列
,如果排序后为等差数列,那么公差
要证明这个引理,我们只需要考虑证明交换相邻两个数的位置不改变这个式子的值
Case1:我们交换了
Case2:不妨假设我们交换了
我们只需要计数满足
对
注意到排序后满足
E
题意
给定一棵树,经过边
吐槽
虽然思路很平凡,但是没人翻译,估计也没啥人愿意写...
题解
点分治,之后我们可以强制
对于每个点预处理出根节点走到它最少需要多少油,计算贡献时,去除
B
题意
给定一个
特别的,你还需要输出第一行吃炮事件完全优先于第二行吃炮事件发生的方案数
吐槽
感觉也就这样...
题解
显而易见,一个含有
一般的,输出
对于特别的情况,输出
而
且
后面是一个组合数列和,可以求