(锅真多)
(起码没坑)
T1 sum(保护血槽)
看起来非常基础,事实上也很基础有一定的思维难度
(听说有人枚举点
O
(
n
3
)
O(n^3)
O(n3)做=_=)
我写的是 O ( n 2 ) O(n^2) O(n2)的,先破环成链,就可以乱搞了:
for (int i = 1; i <= n ; i ++)
{
int sum = 0 ;//血量
bool flag = false;//标记
for (int j = i ; j < i + n ; j ++)
{
sum += a[j];//修改血量
if (sum < 1) //如果GG了
{
flag = true;//标记已经GG了
break;//退出程序
}
}
if ( ! flag ) ans ++ ;//如果没有GG,答案+1
}
正解四个预处理
将原数列分为
a
1
.
.
.
a
j
−
1
a_1...a_{j-1}
a1...aj−1和
a
j
.
.
.
a
n
a_j...a_n
aj...an
A
i
=
∑
j
=
1
i
a
j
A_i=\sum_{j=1}^ia_j
Ai=∑j=1iaj
B
i
=
∑
j
=
i
n
a
j
B_i=\sum_{j=i}^na_j
Bi=∑j=inaj
C
i
=
m
i
n
(
A
1
,
A
2
,
.
.
.
,
A
i
)
C_i=min(A_1,A_2,...,A_i)
Ci=min(A1,A2,...,Ai)
D
i
=
m
i
n
(
A
i
,
A
i
+
1
,
.
.
.
,
A
n
)
D_i=min(A_i,A_{i+1},...,A_n)
Di=min(Ai,Ai+1,...,An)
然后写一段这样的代码就行了
for (int i = 1 ; i <= n ; i ++ )
if (D[i] >= 0 && B[i] + C[i - 1] >= 0 ) ans ++ ;
T2 shortk K倍路
(没有-1的点还能光明正大说出来了)
(蜜汁暴力40)
这是一道图上DP(题解就说了拓扑序。。)。
鉴于我的正解还不大正常==
就先不发了==
暴力代码:
void dfs(int p , int sum)
{
if ( ! (p ^ b) )
{
if ( ! ( sum % k ) )
ans = min(ans, sum);
return;
}
for (int i = linkk[p] ; i ; i = e[i].next )
dfs(e[i].y, sum + e[i].v);
}
这道题似乎没有什么坑=_=
T3 Short 最小段
这看起来是一个线段树裸题==
就比如每个区间维护一个长度为k的标记数组,有什么数标什么数==
虽然时空不太会爆(时间还没具体算过),但是是非常难维护的==
所以就有一种类似于最大子段和的维护方法
(那这还是个裸题啊==)
用64位二进制表示一个数集=_= (蜜汁没想到)
当前区间维护的前缀数集,前缀越长,数集越大,但增大次数不超过K
后缀同理
记录维护二进制数与二进制数的第一个位置
合并区间时 前缀更新为左区间前缀或整个左区间+右区间前缀 后缀更新为右区间后缀或整个右区间+左区间后缀
没坑就是好题(大雾