rk6。
题面
抽象。打不过暴力老哥,确实萌新。
萌萌题。代码。
O ( n 4 ) O(n^4) O(n4) 做法:代码。
正解:确定选择奶牛方案时,让甜筒优先作用于 x x x 较小的奶牛不会更劣。那么按 x x x 排序后,最终的答案一定形如:用甜筒处理前几个,用甜筒和前混合处理某一个,用钱处理后几个。
分别 01 背包处理,枚举断点即可。代码
抽屉原理考虑前缀和。余数有 p p p 种,如果区间长度 > p >p >p,显然有两个前缀和的余数相同,答案为 0 0 0。否则暴力计算。时间复杂度 O ( m p 2 ) O(mp^2) O(mp2)。代码。
没开 long long
挂成 72。
数据很抽象,暴力能过。
从大往小枚举 a i a_i ai 作为 max a \max_a maxa,则只需关心比 max a \max_a maxa 大的,相当于每次加入一个物品。
对于每一个可能的 max b \max_b maxb,需要求出大于 max b \max_b maxb 的最大 c c c,要维护一个 c c c 的后缀最大值。
全局维护一个 max b + max c \max_b+\max_c maxb+maxc 的最小值。
考虑权值线段树。
具体来说,随着 max b \max_b maxb 的增大, max c \max_c maxc 一定是单调不增的。那么加入一个物品 max c \max_c maxc 发生改变的一定是一段连续区间,二分找到区间更新。对于区间 max c \max_c maxc 修改的区间,其 max b \max_b maxb 取区间最左 b b b。时间复杂度 O ( n log 2 n ) O(n \log^2n) O(nlog2n)。
具体实现与代码
预估 100 + 76.2 + 100 + 20 = 296.2 100+76.2+100+20=296.2 100+76.2+100+20=296.2,实际 72.7 + 38.1 + 72.7 + 9.1 = 192.6 72.7+38.1+72.7+9.1=192.6 72.7+38.1+72.7+9.1=192.6。
发挥抽象。A B 理解错题意,C 想到了抽屉原理但没开 long long
,D 的暴力没打好。
rk1。
题面
萌萌题。
枚举 i = min ( S ) i=\min (S) i=min(S),答案就是 ∑ i = 1 n 2 n − i ( 2 i − 1 − 1 ) \sum _{i=1}^n 2^{n-i}(2^{i-1}-1) ∑i=1n2n−i(2i−1−1),容易化成 n × 2 n − 1 − 2 n + 1 n\times 2^{n-1}-2^n+1 n×2n−1−2n+1。
开 __int128
。
代码
卡卡题。
O ( n ) O(n) O(n) 换根。记录最小值、次小值。
代码
难难题。
标记区间的并,枚举关系,时间复杂度 O ( q ( n + m ) ) O(q(n+m)) O(q(n+m))。
把互斥关系视为二维点。对于 x ∈ [ l i , r i ] x \in [l_i,r_i] x∈[li,ri], ∀ j \forall j ∀j,数 y ∈ [ l i , r j ] y \in [l_i, r_j] y∈[li,rj] 时是否有点。
二维数点一般做法是用 BIT,我们将询问离线后搭配扫描线可以做到 O ( ( ∑ k 2 + m ) log n ) O((\sum k^2 + m)\log n) O((∑k2+m)logn)。
对于在线做法,考虑可持久化线段树。具体地,考虑维护 n n n 棵线段树,每棵线段树维护 x ∈ [ 1 , i ] x\in [1,i] x∈[1,i] 的矩阵点数。查矩形 ( l i , r i ) ( l j , r j ) (l_i,r_i)(l_j,r_j) (li,ri)(lj,rj) 就拿第 r i r_i ri 棵线段树的区间询问减去第 l i − 1 l_i-1 li−1 棵的。复杂度 O ( m log n + ∑ k 2 log n ) O(m \log n + \sum k^2 \log n) O(mlogn+∑k2logn)。
算法 1 在 q q q 较小时效率较高,算法 2 在 k k k 较小时效率较高。而随着 q q q 的增大, k k k 减小。因此考虑分治, k > B k > B k>B 时算法 1, k ≤ B k \le B k≤B 时算法 2。
分别计算上界:算法 1 至多执行 ∑ k B \frac {\sum k} {B} B∑k 次,上界 O ( ∑ k B ( n + m ) ) O(\frac {\sum k} {B} (n +m)) O(B∑k(n+m))。算法 2 在 k k k 较大时会取到上界,所有的 k = B k=B k=B 时,算法 2 至多执行 ∑ k B \frac {\sum k} {B} B∑k 次,上界 O ( ∑ k B × B 2 log n ) O(\frac{\sum k}{B}\times B^2 \log n) O(B∑k×B2logn)。
总时间复杂度为 O ( ∑ k B ( n + m ) + ∑ k B × B 2 log n ) O(\frac {\sum k} {B} (n +m) + \frac{\sum k}{B}\times B^2 \log n) O(B∑k(n+m)+B∑k×B2logn)。 n , m , q , ∑ k n,m,q,\sum k n,m,q,∑k 同阶时, B = n log n B = \sqrt{\frac{n}{\log n}} B=lognn 时取得最小值。
小 trick:只需要存有用的结点,即不建树,只修改。
代码
预估 100 + 100 + 40 = 240 100+100+40=240 100+100+40=240,实际 100 + 90 + 60 = 250 100+90+60=250 100+90+60=250。B 同样的代码赛后能过,评测机的锅。萌新 A B 花的时间有点长,遂 C 打了个还算优秀的暴力,转二维数点和根号分治比较难想到。
rk2。
题面
萌萌题,但是看错题。
代码
典典题。
二分平均值 x x x。统计均值小于 x x x 的方案数,每个数减去 x x x 后即统计多少个区间和 < 0 <0 <0。容易发现是个二维偏序问题,归并排序统计即可。
代码
典典题。
n ≤ 1500 n \le 1500 n≤1500, O ( n 3 ) O(n^3) O(n3) 可以用 bitset
优化。
记 S S S 为 u , v u,v u,v 均能到达的点集,答案为:
∑ ( u , v ) ∈ E ( deg ( u ) − 1 ) × ( deg ( v ) − 1 ) − ∣ S ∣ \sum_{(u,v)\in E} (\deg (u) - 1) \times (\deg(v) - 1)-|S| (u,v)∈E∑(deg(u)−1)×(deg(v)−1)−∣S∣
代码
哈哈题。
大体思路就是每个点被 bfs 更新的第一次就是最短路。
O ( n 2 + n + m ) O(n^2+n+m) O(n2+n+m):暴力建边 bfs 即可。
考虑建权值虚点,原图点向对应权值虚点建权值为 1 1 1 边。
O ( 3 20 + n + m ) O(3^{20} + n + m) O(320+n+m):对于每个 v a l i val_i vali 向其子集虚点建权值为 0 0 0 的边。
O ( 20 × 2 20 + n + m ) O(20\times 2^{20}+n+m) O(20×220+n+m):为避免重复的访问,对于每个 v a l i val_i vali 向 v a l i val_i vali 去掉一位的权值虚点建权值为 0 0 0 的边。
预估 100 + 100 + 100 + 40 = 340 100+100+100+40=340 100+100+100+40=340,实际 10 + 40 + 100 + 20 = 260 10+40+100+20=260 10+40+100+20=260。A 题目看错,提交期间重新交了一发。B 用 BIT 多次离散化会比归并多点常数,被卡到了 40 40 40。C 没啥好说的。D 建虚点的套路比较难想。挂了 170 170 170 分?
rk6。
题面
链接
萌萌题。卡常。第二次考了爆 long long
的问题。
代码
kmp 求个 fail,从后往前数数即可。
代码
分层图跑最短路,点数 O ( n k ) O(nk) O(nk) 级别,边数 O ( m k ) O(mk) O(mk) 级别。
代码
不想做评价。