[JXOI2017]数列
首先有个暴力的DP
f
i
,
j
,
l
,
r
f_{i,j,l,r}
fi,j,l,r 表示到 i,
A
i
=
j
A_i=j
Ai=j,
A
i
A_{i}
Ai 的前驱为 l, 后继为 r
然后枚举下一位填什么就可以转移了
考虑怎么优化,应该就是前缀和了
j
,
l
,
r
j, l, r
j,l,r不相等的情况
f
i
,
j
,
l
,
r
=
∑
x
<
=
l
j
f
i
−
1
,
l
,
x
,
r
+
∑
x
>
=
r
f
i
−
1
,
r
,
l
,
x
f_{i,j,l,r}=\sum_{x<=l}^jf_{i-1,l,x,r}+\sum_{x>=r}f_{i-1,r, l, x}
fi,j,l,r=∑x<=ljfi−1,l,x,r+∑x>=rfi−1,r,l,x
j
=
l
=
r
j=l=r
j=l=r的情况
A
i
−
1
=
x
,
f
i
,
x
,
x
,
x
=
∑
l
<
=
x
∑
r
>
=
x
f
i
−
1
,
x
,
l
,
r
A_{i-1}=x,f_{i,x,x,x}=\sum_{l<=x}\sum_{r>=x}f_{i-1,x,l,r}
Ai−1=x,fi,x,x,x=∑l<=x∑r>=xfi−1,x,l,r
A
i
−
1
!
=
x
,
f
i
,
x
,
x
,
x
=
∑
y
!
=
x
(
∑
k
<
=
y
f
i
−
1
,
y
,
k
,
x
+
∑
k
>
=
y
f
i
−
1
,
y
,
x
,
k
)
A_{i-1}!=x,f_{i,x,x,x}=\sum_{y!=x}(\sum_{k<=y}f_{i-1,y,k,x}+\sum_{k>=y}f_{i-1,y,x,k} )
Ai−1!=x,fi,x,x,x=∑y!=x(∑k<=yfi−1,y,k,x+∑k>=yfi−1,y,x,k)
然后就可以前缀和优化了
[JXOI2017]加法
先二分答案,然后每次贪心加,即把右端点最右的那个区间+1
然后优先队列取区间,树状数组加就可以了
[JXOI2017]颜色
转换为求合法区间
[
L
,
R
]
[L,R]
[L,R]的个数
st 表示颜色第一次出现位置,ed表示最后一次出现,pre表示上一次出现位置
[
L
,
R
]
[L,R]
[L,R] 合法,当且仅当直接的所有颜色
s
t
>
=
L
,
e
d
<
=
R
st>=L,ed <=R
st>=L,ed<=R
考虑枚举 R 然后查询可行的 L 的个数
对于一个
s
t
<
e
d
<
=
R
st<ed<=R
st<ed<=R 区间
[
s
t
+
1
,
e
d
]
[st+1,ed]
[st+1,ed] 不能作为 L
对于一个
p
r
e
e
d
<
=
R
<
e
d
pre_{ed}<=R<ed
preed<=R<ed 区间
[
1
,
p
r
e
e
d
]
[1,pre_{ed}]
[1,preed] 不能作为 L
于是遇到第1种就线段树暴力赋0,第二种就找到 ed > R 的最大的
p
r
e
e
d
pre_{ed}
preed,然后查询
[
p
r
e
e
d
+
1
,
i
]
[pre_{ed}+1,i]
[preed+1,i]的和
找最大的
p
r
e
e
d
pre_{ed}
preed可以用一个栈,如果ed<当前i,直接弹掉不要
JXOI2017 题解
最新推荐文章于 2022-07-16 17:37:39 发布