近期刷题总结 [19 03 24]

目录

CF14D Two Paths [树的直径]

P3174 [HAOI2009]毛毛虫 [树的直径]

P2312 解方程 [秦九韶算法]

CF888D Almost Identity Permutations [ DP ]

CF888G Xor-MST [0/1 trie]

CF863D Yet Another Array Queries Problem [ splay 模板 ]

P3700 [CQOI2017]小Q的表格 [ 毒瘤推式子+phi + 分块 ]

P3698 [CQOI2017]小Q的棋盘 [ 贪心 ]

P3747 [六省联考2017]相逢是问候 [ 线段树 + 扩展欧拉定理 + 均摊复杂度分析]

CF1065F Up and Down the Tree [ 树形DP ]

P3569 [POI2014]KAR-Cards [ 贪心 + 线段树维护决策 ]

P2607 [ZJOI2008]骑士 [基环树DP模板]

P3962 [TJOI2013]数字根 [st表]

P3964 [TJOI2013]松鼠聚会 [ 切比雪夫转曼哈顿]

P3961 [TJOI2013]黄金矿工 [ 有依赖背包 ]

P3761 [TJOI2017]城市 [ 树的直径 ]

P3199 [HNOI2009]最小圈 [分数规划+spfa]

P4067 [SDOI2016]储能表 [数位DP]

P4103 [HEOI2014]大工程 [ 虚树 ]

BZOJ3514 [LCT + 主席树] 

BZOJ5016 [莫队]


CF14D Two Paths [树的直径]

枚举断边, 然后分别求直径


P3174 [HAOI2009]毛毛虫 [树的直径]

考虑点的个数不好考虑, 转换一下思路变成边呢 ? 点的个数就是边的个数+1

Ans= 2 + \sum_{i=1}^kd[i]-1 

 其中 d 为度数, 然后点权作为d[i] - 1 跑直径


P2312 解方程 [秦九韶算法]

发现对一个或两个大质数取模冲突概率很低

然后有 a_1x^k+a_2x^{k-1}+...+a_kx+a_{k+1}=x(a_1x ^ {k-1}+a_2x^{k-2}+...+a_k) + a_{k+1}

于是可以O(k) 求f(x) , 然后枚举就可以了, 复杂度O(mk)


CF888D Almost Identity Permutations [ DP ]

f[i][j] 表示1--i 有j个不在应有位置上的个数

考虑第i+1位, 令i+1位填i+1, 如果不与前面交换, f[i][j] += f[i-1][j]

如果与前面一个不在应有位置的交换, f[i][j] += f[i-1][j-1] *  (j-1)

如果与前面一个在应有位置的交换, f[i][j] += f[i-1][j-2] * (i-j+1)


CF888G Xor-MST [0/1 trie]

由于异或的特性, 异或值大小取决于二进制下相同位置0/1值相同的数量

最小代价就是相同的多, 所以可以看成两颗子树的合并。

所以我们设置一个siz数组, 若根的两端都有节点就进行合并:

枚举siz小的子树中的所有数, 到另一个子树中查找最小异或和, 更新答案


CF863D Yet Another Array Queries Problem [ splay 模板 ]


P3700 [CQOI2017]小Q的表格 [ 毒瘤推式子+phi + 分块 ]

\frac{f(a,b)}{a*b} = \frac{f(a,a+b)}{a*(a+b)}

然后惊讶地发现

\frac{f(a,b)}{a*b}=\frac{f(a,b \equiv a)}{a*(b\equiv a)}

因为  f(a,b)=f(b,a), 所以   \frac{f(a,b)}{a*b}=\frac{f(b,a)}{b*a}=\frac{f(b,a\equiv b)}{ b * (a\equiv b)}

这不就是GCD吗

\frac{f(a,b)}{a*b}= \frac{f(gcd(a,b),gcd(a,b))}{gcd(a,b)^2}

Ans=\sum_{d=1}^n \sum_{i=1}^n \sum_{j=1} ^ n ij\frac{f(d,d)}{ gcd(d)^2}[gcd(i,j)=d]=\sum_{d=1}^n f(d,d)\sum_{i=1}^{n/d} \sum_{j=1} ^ {n/d} ij[gcd(i,j)=1]=\sum_{d=1}^nf(d,d)F(n/d, n/d)

F(x) = 2 * \sum_{i=1}^x i * (\varphi(i)*i+[i=1])/2-1=\sum_{i=1}^x i^2\varphi(i)

然后需要写一种数据结构要求单点修改f, 并查询前缀和, 因为查询前缀和是套在整除分块里面的, 所以应该做到O(1)

而修改可以O(sqrt(n)), 分块维护前缀和就可以了


P3698 [CQOI2017]小Q的棋盘 [ 贪心 ]

最开始走第一条链的时候每一步多一个节点, 否则需要下去上来两次才能多一个

然后第一次走最长链就可以了


P3747 [六省联考2017]相逢是问候 [ 线段树 + 扩展欧拉定理 + 均摊复杂度分析]

线段树维护已算次方的最小值, 如果区间最小值都大于需要的最小值( 模到phi[p] = 1的次数 )就不用开了


CF1065F Up and Down the Tree [ 树形DP ]

g[i] 表示能回来的, f[i] 表示回不来的

g[u] = \sum g[son] (Mindep[son]-dep[u]<=k)

f[u] = Max(f[son]) + \sum g[son] (Mindep[son]-dep[u]<=k)


P3569 [POI2014]KAR-Cards [ 贪心 + 线段树维护决策 ]

发现一个点如果小的能接到前面用小的更优

于是线段树记录小的大的在上右端点最小是多少


P2607 [ZJOI2008]骑士 [基环树DP模板]


P3962 [TJOI2013]数字根 [st表]

发现每个数的数字根就是它模9 (0 为 9)

预处理每个点与后面最近的哪个点中间的所有数和起来为0--8

询问时枚举每个数字根, 然后查l-r之间所有数的后面那个点在不在区间内, 在就可以作为答案


P3964 [TJOI2013]松鼠聚会 [ 切比雪夫转曼哈顿]

(x, y) 变成 ( x+y / 2, x - y / 2), 然后前缀和一波就可以了


P3961 [TJOI2013]黄金矿工 [ 有依赖背包 ]


P3761 [TJOI2017]城市 [ 树的直径 ]

枚举断边, 发现答案要么是一头的直径, 要么是另一头的直径, 要么是两边各选一个点, 使这个点到任意一点的最大距离最小

我们定义这个距离为半径r, 直径为d, 就是(d1, d2, r1+r2+w)取一个max

我们考虑一件事,就是距离它最远的那个点,在它的子树内还是子树外。

如果在子树内,距离就是第一遍dfs求出的最长链,如果在子树外的话,

我们在树上在做第二遍dfs,这个dfs额外传一个from参数,from表示这个子树之外的最长链

那么这个最长链from有两个来源

1.它父亲的from+它和父亲的距离

2.它父亲的其他子树中的最长链+他和父亲的距离

对于情况二,如果他就是父亲的所有孩子中的最长链,那么我们的情况2要取次长链,如果不是取最长链就可以了。

然后枚举每个点,半径就是min(max(dp[i],from[i]))了


P3199 [HNOI2009]最小圈 [分数规划+spfa]

二分一个答案然后判负环就可以了


P4067 [SDOI2016]储能表 [数位DP]


P4103 [HEOI2014]大工程 [ 虚树 ]

建出虚树后统计答案, 考虑每条边的贡献 -> dis * siz[son] * (tot - siz[son])

然后维护Min, Max 表示到子树中的关键点最小, 最大

如果该店是关键点, ans = min(ans, Min), ans = max(ans, Max), 并且将Min设为0

如果不是的话, 最小值就是(Min[son] + dis + Min[u]), 可以形象地理解为最小+次小


BZOJ3514 [LCT + 主席树] 


BZOJ5016 [莫队]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值