闲扯
今天打了 $3$ 道题的暴力,结果全部打挂了。。。
$T1$ 的想法和正解一毛一样,就是没打出来,而且还把题中的按位或看成按位异或了。。。
题面
$T1$
Solution
对于这种关于位运算的题目,我们可以考虑将原数拆开,对每一位分别进行计算。
我们考虑一个子矩阵,如果在这个矩阵中该位有贡献,那么对于按位于就等价与该子矩阵中的数都为 $1$ ,对于按位与就等价于该子矩阵中至少有一个 $1$ 。
对于按位与,我们可看做所有的矩形减去全为 $0$ 的矩阵的贡献。
这样我们就将问题统一成了求全 $1$ 子矩阵和全 $0$ 子矩阵的个数。
我们可以用单调栈来求,做法和求最大子矩阵类似,就不写了才不会告诉你们是我懒得写呢
Code
1 |
|
$T2$
Solution
问题等价于求有多少种方案,使得删去一条边后,该图是一个二分图。
对于二分图,我们有一个定义是:没有奇环的图。
对于一个连通块,我们可以考虑先求出一颗原图的生成树。
对于每一条非树边,我们连接之后,一定会形成环。
如果是奇环,那么我们就将计数器加一。
对结果进行分类讨论。
- 如果 $cnt=0$ ,说明没有奇环,每一条边都可以。
- 如果 $cnt=1$ ,那么我们一定要删去该奇环上的边。但要保证它没有位于偶环上。
- 如果 $cnt>1$ ,那么我们一定要删去所有奇环的交集内的边,同样不能在偶环上。
为了问题便于解决,我们可以用树上差分。
所有位于奇环上的边,我们将其全部加 $1$ ;如果位于偶环上,那么我们将其全部减 $1$ 。
这样做最后的答案就是权值等于 $cnt$ 的边。
Code
1 |
|
$T3$
Solution
我们可以知道,欧拉函数值 $\varphi(x)$ 只和 $x$ 与 $x$ 包含的质因子有关。
通过打表可以发现,在 $300$ 以内的质数只有 $62$ 个,刚好可以用一个 $long\ long$ 的数来表示。
我们可以用线段树维护区间的乘积和区间含有的质数。
这样每次查询、修改就很简单了。
Code
1 |
|
为了卡常改的面目全非了。。。
$ps:$ 有一种优化方式是,将这 $62$ 个数分为 $4$ 段,维护出每一段中的每种质数集合的贡献,查询时直接合并就行。
总结
做题要细心。题要看对,暴力一定不要打错,想到方法要大胆尝试,不要不敢打。。。