GDOI2021简要题解

GDOI2021游记

\(Day\ 1\)

\(T1\)

考虑修改一定是前缀和后缀,枚举修改的前缀,后缀指针移动取最优即可。

需要预处理一下前缀\(min,max\)和后缀\(min,max\)

\(T2\)

差分约束,爬了。

发现限制不等式每个都有四个变量,考虑是否可以分成行和列。

我们考虑是否对于每个位置\(a[i][j]\)用行和列来差分约束得到答案。

考虑只修改第一行第一列上的数,考虑修改带来的变化,发现一定是改变一整行或一整列。

所以我们可以这样看:

\([+1,-1,+1,-1]\)是一行的变化,而

\[[-1]\\ [+1]\\ [-1]\\ [+1]\\ \]

则是一列的变化,可以通过这个来进行差分约束。

对于每个位置\([i][j]\),则有\(0<=a[i][j]+(-1)^{i}lie[i]+(-1)^{j+1}hang[j]<=1e6\)

由于差分约束要保证未知数异号,所以而我们将\(lie[i],hang[j]\)的正负号交错开即可。

则上面的式子就可以得到约束关系,跑\(spfa\)求出解即可。要注意判无解情况。

\(T3\)

对于\(h(G)\)。可以发现他就是要求存在\(u\rightarrow v\)\(v\rightarrow u\)且不经过编号\(<\min(u,v)\)的点对个数。

考虑从后往前加边并增加答案贡献,可以发现,答案贡献只会是编号\(<min(eg_u,eg_v)\)的点。

我们设\(f[u][v]\)表示\(u\rightarrow v\)且不经过编号\(<\min(u,v)\)是否存在,\(g[u][v]\)表示反向的\(v\rightarrow u\)且不经过编号\(<\min(u,v)\)是否存在。

考虑更新答案,对于\(f[u]\)则只有当\(f[u][eg_u]\ and\ !f[u][eg_v]\)才能更新,\(g[u]\)则类似。由于每个状态最多遍历一遍,所以时间复杂度为\(O(n*m+n*n)\)。大概也许可以跑过的吧。

\(Day\ 2\)

\(T1\)

考虑倍增,记每个点颜色是在\(p\)中的位置,则每个点的父亲是颜色为当前点颜色加一的最近祖先。

对于\(x\rightarrow lca\),则只需要预处理出每个位置上面最近的颜色\(1\)为位置再跳倍增即可。

对于\(lca\rightarrow y\),则只需要二分一下答案颜色,然后先得到\(y\)上面最近的颜色\(mid\),再跳另一个倍增数组即可。

对于找到最近颜色\(mid\),可以考虑离线询问然后在遍历是在线维护一下当前上面所有颜色即可。

\(T2\)

暴力\(dfs\)时间复杂度\(O(n!*n)\)可以\(60\)。考虑用\(DP\)转移。

考虑暴力\(DP\)\(f[i][S][val][j]\)表示上一个是\(i\),选了\(S\)集合的数,\(i\)的值是\(val\),用了\(j\)的方案数。

我们考虑的是花费的最小代价,因为如果代价\(<=m\)的话显然可以通过后缀\(+1\)达到\(m\)

然后我们考虑\(val\)这个其实没有必要存,对于当前加的值,后面都要加而且不影响后面的相对大小,所以加\((n-hav)\)个即可。

\(DP\)设法变成\(f[i][S][j]\),时间复杂度\(O((n+1)*2^{n-1}*m)\)。枚举子集和补集的时间复杂度是\(\sum_{i=1}^n C(i,n)*i=(n+1)*2^{n-1}\)

\(T3\)

支配树,爬了。

其实不需要真的打支配树,可以用\(O(n^2)\)的暴力建树摁过这题。

其实我们可以通过推一下性质来解决这道问题。

考虑支配,我们可以用\(O(n^2)\)的时间求出每个点的受支配集。即每次删除一个节点看看从\(1\)能走到哪些点。

考虑添加一条边\((u,v)\),如果一个点\(x\)的受支配集发生了变化,那么原图离\(x\)最近的支配\(x\)的点\(fa[x]\)会从\(x\)的受支配集中去除,或者是\(fa[x]\)的受支配集发生了变化,那我们可以想到建一棵支配树,父亲是离当前点最近的支配它的点,那么当一个点的受支配集发生了变化,那么这个点在支配树中的子树中的每个点的受支配集也一定会发生变化。

这样我们就可以得到一个比较容易想到的做法,就是遍历一遍支配树,如果当前点的受支配集发生变化,那么答案加上这个子树的点数。

这样做的话,那么受支配集中变化一定是当前点\(x\)\(fa[x]\)从受支配集中消失了。那我们就依据这个来进行判断。考虑消失的话,一定是用了\((u,v)\)这条边:\(1\)可以不经过\(fa[x]\)到达\(u\)\(v\)可以不经过\(fa[x]\)到达\(v\)。而这两个条件都可以\(O(n^2)\)来预处理出来。这里还要特判一下\(fa[x]==v\)的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值