20210908上午
大摆特摆!
T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | |
---|---|---|---|---|---|---|---|---|
预测 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
一测 | 60 | 30 | 100 | 100 | 10 | 80 | 100 | 100 |
T1:
树上操作,枚举每个点为根计算答案,复杂度
O
(
n
2
)
O(n^2)
O(n2)。
显然有个
O
(
n
)
O(n)
O(n)的换根dp,不多
O
(
n
2
)
O(n^2)
O(n2)都能过就不用写了。
死因:作死用1e4取
min
\min
min,挂的妈都认不得。
T2:
先跑最短路,之后枚举每个点的每条边,若
d
i
s
v
=
d
i
s
u
+
v
w
dis_v=dis_u+v_w
disv=disu+vw,说明
w
w
w这条边可以在最短路上,对每个点统计之后乘起来就行。因为图接近稠密图所以建议朴素dij(SPFA没被卡还是太善良了)。我想装逼手写配对堆整个
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),结果一步写错加空间开小把自己玩死了。
void change(int x,int v){
val[x]=v;fa[x]=0;
if(x==rt) pop();
rt=(rt?x:merge(x,rt)); //应该是rt=(rt?merge(x,rt):rt)
return;
}
T3:
最小生成树板子,考虑
k
r
u
s
k
a
l
kruskal
kruskal过程就能看出这俩没啥区别。
T4:
题目熟肉:给一棵树,统计所有非直接相连节点间的路径上的最小边权加一的和。
那么就需要知道每条边左右有多少点以此边作为最小边。
最小边?
k
r
u
s
k
a
l
kruskal
kruskal不就是把边从小到大加的?每次两边的并查集大小似乎就是节点两边的点的集合?
成功发现正确算法,写一个带
s
i
z
siz
siz的并查集就行,每次合并的时候
a
n
s
+
=
(
s
i
z
i
×
s
i
z
j
−
1
)
×
v
i
,
j
,
f
a
j
=
i
,
s
i
z
i
+
=
s
i
z
j
ans+=(siz_i\times siz_j-1)\times v_{i,j},fa_j=i,siz_i+=siz_j
ans+=(sizi×sizj−1)×vi,j,faj=i,sizi+=sizj。
T5:
可以来回走加有向图应该立刻想到强连通分量,所以先缩点并且记录强连通分量信息最高价格
m
x
i
mx_i
mxi和最低价格
m
n
i
mn_i
mni,建新图为一个
D
a
g
Dag
Dag,设计
f
i
f_i
fi表示从
1
−
i
1-i
1−i的最小价格,
a
n
s
i
ans_i
ansi表示到
i
i
i的答案,可以得到
f
v
=
min
u
→
v
(
f
u
,
m
n
v
)
f_v=\min_{u\to v}(f_u,mn_v)
fv=minu→v(fu,mnv),
a
n
s
v
=
max
(
max
u
→
v
a
n
s
u
,
m
x
v
−
f
v
)
ans_v=\max(\max_{u\to v}ans_u,mx_v-f_v)
ansv=max(maxu→vansu,mxv−fv),拓扑转移就行。
死因:只转移了
f
f
f没转移
a
n
s
ans
ans,大家都看过来,我是____。
T6:
经典差分约束,
f
i
>
f
j
→
f
i
≥
f
j
+
1
f_i>f_j \to f_i \ge f_j+1
fi>fj→fi≥fj+1,把
f
f
f理解为
d
i
s
dis
dis可知是求最长路,建图拓扑就行,如果有拓扑没更新到的点说明成环,无解。
错因:装逼拓扑不直接进队建了个虚根,边数炸了。
T7:
。。。判断字母和##是否同时出现。。。非常傻逼的题。
T8:
打表找规律,把每次节点状态和叶节点输出来。
可以发现叶节点就是左边二进制转成数字之后,叶节点从左往右数的第几个,即
a
n
s
i
=
l
e
f
t
i
+
2
n
−
1
ans_i=left_i+2^{n-1}
ansi=lefti+2n−1,而左边二进制每位数字也很有规律,他的从左往右数的第
i
i
i位就是
(
l
>
>
i
)
&
1
(l>>i)\And 1
(l>>i)&1的值。算一遍就行。
总结:我以后再也不装逼了。