SWJTU_LightMoon Training #1
B 3
F 1
G 1
I 100
J 1
N 区间(dp)。构造一棵有条件限制的树。
O 线段树和分块应该都能做 线段树的话可以直观的想一下当更新的区间小的时候,一直更新下去,当区间大的时候最后会有一大片的区域是相同的颜色,根据这个在写的时候相同颜色就直接更新就行了。
P 0/1背包。
Q 1e6貌似用莫队很难莽过去吧,乍一看把询问区间全部异或就得出了出现奇数次的数的异或和,可是题中要求的是偶数次的,(一脸智障),不过仔细想想再异或一个区间里不同的数最后的结果不就是要求的偶数次的异或和嘛,所以离线下来,用树状数组维护不同数异或的前缀和。
SWJTU_LightMoon Training #2
A 0
C 0
E 4 环套树DP
I 主席树,把n个元素倒着插进主席树中,把上次出现的同一个值的元素的贡献值-1,新的这个值的贡献值+1,这样就可以把这个元素最左侧的位置的贡献保留。查询区间[L,R]时只要查询第L个版本的主席树就好了。
K 18 数位DP
SWJTU_LightMoon Training #3
C 容斥+预处理
D 贪心,如果要朋友在陌生人列表上rank最高的人数和最小,那么朋友应尽可能是自己朋友列表中rank最高的。我们很容易得到如果a是b列表中朋友最高的,那么b列表中就不能出现比a rank高的,根据题目所给条件,我们已知了一些存在的朋友关系,那么由这些朋友关系,我们可以知道每个人所能够接受的是他列表中的最高rank的最低值,当然我们不应该忘记一个事实,最高rank的朋友是Tom列表中rank最高的(虽然是废话,但是可能会疏忽)。接下来就是给各个人安排了,当我们给a安排朋友b使得a是其列表中rank最高的,那么a的rank应该大于之前所预处理的b的最高rank。之后用优先队列去维护即可,此处并没有优先给rank高或rank低的安排的优势,所以从小或从大遍历都是可以的。
[Megumin的代码] (代码什么的,当然是不存在的呀)
E 二分+贪心
F 同余方程组+打表
I 完全背包+最短路 问题转化成在不超过魔力n的情况下,让你选择尽可能多水晶来卖更多的钱,这个显然是完全背包,然后就是求每种水晶的最小消耗魔力,因为合成是传递的,所以最短路跑一遍
K 0/11
SWJTU_LightMoon Training #4(2017中国大学生程序设计竞赛 - 网络选拔赛)
1002 (3/21) 广义的Hall 引理 枚举 dfs+维护增广路 状压DP 同UESTC TRAINING #12 B
1006 dp+线段树维护
- (01)串的不同子串是可以递推计数的(= =||)。令(f[i][0/1])表示前(i)个长度小于等于(i)的结尾为(0/1)的不同子串数目,若(S[i]=‘0’)则(f[i][0]=f[i-1][0]+f[i-1][1]+1), (f[i][1]=f[i-1][1])。(S[i]='1')时同理。
- 将表达式写成矩阵的形式(有两个矩阵,且调换行和列后变成另一个矩阵),用线段树维护矩阵相乘。翻转更新线段树时,直接在结果矩阵调换行和列。因为所有矩阵都调换某一行/列时,乘积结果也调换某一行/列。
1008 (32/95) dp
1009 利用笛卡尔定理,我们可以得到四个圆半径之间的关系,同时要求下一个圆时,其与另一侧的圆的半径的倒数刚好是方程的两个根,那么我们根据韦达定理即可得到线性递推式,其次,当n大于一定程度时,结果趋向于一个定值,此时提前break即可。
[Megumin的代码] (代码什么的,当然是不存在的呀)
1010 (4/18) 莫比乌斯+组合
1011 (6/41) bitset
SWJTU_LightMoon Training #5
B 2 / 32 A*
E 高斯消元+dfs
I 5 / 10 BFS+dp
J 3 / 21 极角排序+set+最短路dp
K 49 / 187 dp
- 令(dp[i][j][0/1])表示到第i层,选(0/1),最近的一个不同的是第(j)层,第(i+1)层与第(i)层不同。
- 由于([l+1, r])的“颜色”一样,容易求得他们到最近层的花费。
- 有两个特殊的转移。一个是底下(i)层没有不同的颜色,另一个是接下来的层都没有相同的颜色(这个应该可以统一起来)。