2020.09.29pm
作者:互联网
2021.09.29PM
预期 | 实际 | |
---|---|---|
A | 100 | 100 |
B | 100 | 100 |
C | 10 | 20 |
D | 0 | 10 |
S | 210 | 230 |
可能水,一定菜
A 满汉全席\(\blacktriangle\!\blacktriangledown\!\blacktriangle\)
才明白这个成语啥意思。- 还是之前那句话,用 \(Tarjan\) 的紫题都很水。
- 这道题由于食材要么用于做汉式要么做满式就能联想到 \(2-SAT\)。
- 同时评委会给出更多的约束条件,那就更是 \(2-SAT\) 了。
- 每个评委不做第一道菜(或者说用该种食材做了另一种菜)必须做第二道菜;不做第二道菜必须做第一道菜,最后检查是否同一个食材又要做汉式又要做满式,跑 \(Tarjan\) 找强连通分量即可。
- \(P.S.\) 考试的时候我其实不是这样写的。我设的状态更多(做汉式,不做汉式,做满式,不做满式,变成两个点,食材也变成约束关系),但其实问题也不大,只要理得清矛盾关系,不漏掉矛盾关系就问题不大。
B 部落划分 \(\blacktriangle\!\blacktriangledown\)
- 好家伙,最小生成树没想出来,倒是用之前口胡的常数更大的方法做的····。
- 先说考试时候的方法吧——二分最大距离。
- 我们把所有小于等于最大距离的边都建上,同时用并查集维护看最后有几个连通块。
- 如果连通块数目大于等于 \(k\) 说明成立,反之不成立。(大于 \(k\) 可以把几个连通块合并,不会使距离变小)
- 再说最小生成树吧,这道题只能说用了最小生成树的思路。
- 先建当前最短的边,直到当前只有 \(k\) 个连通块。
- 正确性显然。
C 冷冻波 \(\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\!\blacktriangle\!\blacktriangledown\)
- 不仅不会做,而且不会做。
D 蔬菜庆典\(\blacktriangle\!\blacktriangledown\!\blacktriangle\)
- 笑死,比赛时心想最后一道,大抵整不动,样例都没分析····要是分析一下说不定就整出来了?。
- 这个地方有个离谱的地方:+inf要分开算,导致解题要分成两个部分,让人十分难受。
Part 1 +inf
- 首先从样例2能看出第一个规律:如果儿子不同,自己不是根,答案就是+inf。(由于根不能变,之后除非专门提及根,默认为除根外的其它点。)
- 证明:\(v[x] \to v[fa]+v[son_1]-v[x] \to v[fa]+v[son_2]-(v[fa]+v[son_1]-v[x])=v[son_2]-v[son_1]+v[x]\)
- 其次,即使儿子相同,但有一个儿子的值可以变化,会造成两个儿子不同,同样是+inf,而不能变化是由于儿子为叶子节点,或儿子 \(y\) 一定满足 \(f[y]=f[fa_y]+f[son_y]-f[y]\)
- 最后,父亲能变自己也能变。(显然)
- 所以最后的代码如下:
void dfs(int x,int fa){//全是单向边
if(out[x]){//不是叶子节点
if(change[fa])change[x]=1;//父亲能变则自己能变
for(int i=head[x];i;i=e[i].nx){
int y=e[i].b;
if(v[y]+v[fa]!=2*v[x])change[x]=1;//自己的值能变化
dfs(y,x);
if(change[y])change[x]=1;//儿子能变自己能变
if(pan)return;//+inf
}
}
if(out[x]>1)//不是一条链
for(int i=head[x];i;i=e[i].nx){
int y=e[i].b;
if(change[y]||v[y]!=v[e[head[x]].b]){pan=1;return;}//儿子有不同值
}
}
Part 2 ans
-
在成功把+inf排除后,显然会满足一个性质:有分叉(有起码两个儿子的点)之后不可能有任何变化。
-
那么能变化的有且只有从根的儿子到各自分叉点的几条链(按道理来说分叉点也是不可变化的,但是如果分叉点底下全是值相同的叶子节点显然是可以变化的,而不能变化放进去也不是不阔以)。
-
考虑怎么样使得链值之和最大。
-
假设一条链为\(A,B,C,D,E\)
-
修改后:\(A,B,B+D-C,D,E\)
-
发现,变成了前后之和减去自己(
废话) -
感觉和换位子很像,考虑差分。
-
差分后:\(A,B-A,C-B,D-C,E-D\)
-
交换后:\(A,B-A,D-C,C-B,E-D\)
-
还原(前缀和):\(A,B,B+D-C,D,E\)
-
发现完全一致。(我觉得能有这个察觉能力的大抵都是省选水平的巨佬,我反正想不到这么深,当然多试几组数据可能可以看出来)
-
那么为了使最后的答案尽可能大,自然进行降序排列。
inline void ji(){//计算链的答案 if(cnt==1)return; for(int i=cnt;i>=2;i--) zhan[i]-=zhan[i-1]; sort(zhan+2,zhan+cnt+1,cmp); for(int i=2;i<=cnt;i++){ zhan[i]+=zhan[i-1]; ans+=zhan[i]; } cnt=1; } void sum(int x){//计算子树答案 ans+=v[x]; for(int i=head[x];i;i=e[i].nx) sum(e[i].b); } void dfs1(int x){ zhan[++cnt]=v[x];//最后面的点虽然不能修改,但也能产生贡献。 if(out[x]>1){ zhan[++cnt]=v[e[head[x]].b];//分叉点也可以更新,而它的儿子一定不能更新 ji(); ans-=v[e[head[x]].b];//之后算子树会重复计算一个点 for(int i=head[x];i;i=e[i].nx) sum(e[i].b); return; } if(out[x]==0){ji();return;} dfs1(e[head[x]].b); }
\(\cal {Made} \ {by} \ {YuGe}\)
标签:2020.09,head,int,son,fa,blacktriangledown,blacktriangle,29pm 来源: https://www.cnblogs.com/u2003/p/15356307.html