https://codeforces.com/contest/1916

E. Happy Life in University(1s,512mb)

n(3e5)个点,根1的树, 每个点有颜色,求$\max(diff(u,lca(u,v)) * diff(v,lca(u,v)))$

其中$diff(u,v) =$,简单路径u到v上不同颜色的个数

我的思路

有想过dp,但是显然dp[u] =最长向下路径,是不行的因为 向上转移时需要知道是否有对应颜色


如果u,v是最大的方案

  • u,v没有祖先关系,那么u,v可以走到其下的任意位置,答案不会更差
  • u,v是祖先关系,那么一个向根走,一个向叶子走, 答案不会更差

因此 ans = max(f(叶子,叶子),f(根,叶子))


对于最近同色也是 可以简单的dfs+按照颜色的栈来做, 这样可以O(n)计算出每个点最近同色祖先


想过把树按照dfs序铺平成数组, 这样需要支持一种叫 整线段贡献

1
2
3
4
对于颜色c
.....in[u]...in[v]...out[v]...out[u]
单点 +1 +1 -1 -1
线段 [ -1 ] [ +1 ]

这样就变成 对于u,

[in[u]....childa...] x [in[u]....childb...]

问题是这样支持线段后,如果直接用前缀和就有问题了

閱讀全文 »

https://codeforces.com/contest/1909

F2 - Small Permutation Problem (Hard Version)

问有多少个 1~n的排列$p$满足, 对于所有$a_i \ne -1$时:

  • $\mathrm{count}(p_{1\cdots i}\le i) = a_i$

范围

$n\in [1,2\cdot 10^5]$

$a_i \in [-1,n]$

个数$\bmod 998’244’353$

2s

256mb

我的思路

对于F1来说$a_i$是没有$-1$的, 那么$a_i$的变化只有$+0,+1,+2$三种

通过dp[i]=前i个限制满足,且只关心前面位置对于放置[1..i]的放置方案即可AC

而这里感觉要处理的就是,两个相邻非$-1$之间的$a_i \to a_j$的转移

有点想用生成函数,$[x^a]f_{i} =$前i个满足时,且第i个的对应个数为$a$的方案数

在转移的优化上,因为一旦$a \ne -1$,那么生成函数其它的系数全为$0$

所以 可以考虑幂次平移 $g_{i} = \frac{f_{i}}{x^a}$

而对于$a = -1$的找比它小的最后一个非$-1$的a来转换

但转移方程似乎会上到二阶导数,没推出简洁的式子

閱讀全文 »

https://atcoder.jp/contests/abc334

G - Christmas Color Grid 2

h x w 地图上0/1

4邻的1为连通块

求等概率把一个1改成0以后 exp(连通块个数) mod 998244353

h,w 1000

2s

1024mb

我的思路

就是找 去掉点后是否还连通,tarjan的算法

然后写出问题了

閱讀全文 »

https://atcoder.jp/contests/abc333

G - Nearest Fraction

给一个(0,1)之间,不超过18位的小数r

求 一个分母<= N的最接近它的分数,如果有多个则输出最小的

n 1e10

2s

1024mb

我的思路

首先r肯定是通过字符串读取变成 整数/10的幂次

然后可以用 连分数的形式展开它

问题是这样的截断连分数因为分母<= N的限制 似乎直接截断不是最优的,二分最后一个位置的值?

例如样例$0.45, N = 5$

$\displaystyle 0.45=\frac{45}{100}=\frac{9}{20}=0+\frac{1}{\frac{20}{9}}=0+\frac{1}{2+\frac{1}{\frac{9}{2}}}=\frac{9}{20}=0+\frac{1}{\frac{20}{9}}=0+\frac{1}{2+\frac{1}{4+\frac{1}{2}}}$

这里 的 连分数是$[0,2,4,2]$

截断的话会是$\frac{1}{2},\frac{9}{4}$ 之间

而最优是$\frac{2}{5} = [0,2,2]$


所以想法是在会超过的地方 做个除法

然而 比较小数C++精度不够,用分数比较 longlong也会overflow

所以直接换语言,上python, 一次性过了

閱讀全文 »

https://atcoder.jp/contests/abc332

G - Not Too Many Balls

n 种颜色的球,颜色i有ai个

m个盒子,第j个盒子最多放bj个球

此外 对于$(i\in[1,n],j\in[1,m])$, 盒子j最多放颜色i的球ij个

问所有盒子放的球的最大个数

n 500

m 5e5

ai,bj [0,1e12]

3s

1024mb

我的思路

这看起来就是 n个点表示颜色,m个点表示盒子

s->球,容量为ai表示这个颜色球最多这么多

球i->盒子j, 容量ij表示 (i,j)的限制

盒子->T 容量bj, 表示每个盒子的限制

这样flow(S,T)的值就是要求的结果


但是问题是 500*5e5 = 2.5e8 感觉会tle?

换一个角度如果把S,T去掉直接变成点分裂,那就是二分图最大匹配

二分图最大匹配从 过程的观点来看,就是有“反悔”的操作


閱讀全文 »
0%