20210907上午
我怎么每次都错的这么神奇呢
T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | |
---|---|---|---|---|---|---|---|---|
预测 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
一测 | 80 | 100 | 100 | 100 | 100 | 100 | 20 | 100 |
T1:
找规律,系数显然与斐波拉契数列相似,判断算出的b是否为整数就行,No answer后面竟然有个句号。。。
T2:
最近线段树写多了,脑子抽了写了个
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)的分治算法,后来一想不就是
max
i
=
1
n
(
s
u
m
i
−
max
j
=
1
n
s
u
m
j
)
\max_{i=1}^n(sum_i-\max_{j=1}^nsum_j)
maxi=1n(sumi−maxj=1nsumj)吗,直接记录
s
u
m
sum
sum和
m
i
n
s
u
m
minsum
minsum
O
(
n
)
O(n)
O(n)推一遍就行。
T3:
枚举中间那个人,分别从左和从右预处理出最长上升子序列,则选出的人为
f
1
i
+
f
2
i
−
1
f1_i+f2_i-1
f1i+f2i−1,取最大即可。
T4:
01背包板子。。。感觉这几天换着出了几遍了。。。
T5:
看到每张牌40张就该知道设计状态
f
a
,
b
,
c
,
d
f_{a,b,c,d}
fa,b,c,d表示用
a
a
a张
1
1
1,
b
b
b张
2
2
2,
c
c
c张
3
3
3,
d
d
d张
4
4
4能获得的最大分数,转移方程
f
a
,
b
,
c
,
d
=
m
a
x
(
f
a
−
1
,
b
,
c
,
d
,
f
a
,
b
−
1
,
c
,
d
,
f
a
,
b
,
c
−
1
,
d
,
f
a
,
b
,
c
,
d
−
1
)
+
s
a
+
2
b
+
3
c
+
4
d
f_{a,b,c,d}=max(f_{a-1,b,c,d},f_{a,b-1,c,d},f_{a,b,c-1,d},f_{a,b,c,d-1})+s_{a+2b+3c+4d}
fa,b,c,d=max(fa−1,b,c,d,fa,b−1,c,d,fa,b,c−1,d,fa,b,c,d−1)+sa+2b+3c+4d
注意为0的情况。
T6:
统计方案数,先跑一遍最长下降子序列,然后再从头跑,若
f
i
=
f
j
+
1
f_i=f_j+1
fi=fj+1则转移情况数,不过注意从后往前转移并且转移至第一个
f
i
=
f
j
&
&
a
i
=
a
j
f_i=f_j\And\And a_i=a_j
fi=fj&&ai=aj时停止,因为这之前的都一定被
j
j
j统计过了,最后把所有
f
i
=
a
n
s
f_i=ans
fi=ans的加起来就是总方案数。
T7:
经典状压,考试时没注意到一个状态会被更新多次没加
max
\max
max挂了。。。服了。
枚举前两行状态和本行状态转移就行了,可以把两行状态压在一起存,为了和前两行和本行不冲突,选择子集枚举,即
S=(1<<m)-1;
for(int t=3;t<=n;t++)
{
for(int I=S-s[t-2],i;;i=I&(i-1))
{
for(int J=S-(s[t-1]|i);;j=J&(j-1))
{
for(int K=S-(s[t]|i|j),k=K;;k=K&(k-1))
{
//神秘操作
if(!k) break;
}
if(!j) break;
}
if(!i) break;
}
}
竖着的状态矛盾处理完了,横着的也很好处理,判断
i
&
(
i
>
>
1
)
i\And (i>>1)
i&(i>>1)和
i
&
(
i
>
>
2
)
i\And (i>>2)
i&(i>>2)就行了,剩下的直接转移就行,记得用滚动数组。
T8:
经典,前几天才出过,
f
i
,
j
=
max
(
f
i
−
1
,
j
,
f
i
−
1
,
j
−
1
)
+
a
i
,
j
f_{i,j}=\max(f_{i-1,j},f_{i-1,j-1})+a_{i,j}
fi,j=max(fi−1,j,fi−1,j−1)+ai,j转移。
总结:还是比较基础的dp,就是希望错误的点能别这么奇怪。。。