JXOI2017 题解

[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 &lt; = l j f i − 1 , l , x , r + ∑ x &gt; = r f i − 1 , r , l , x f_{i,j,l,r}=\sum_{x&lt;=l}^jf_{i-1,l,x,r}+\sum_{x&gt;=r}f_{i-1,r, l, x} fi,j,l,r=x<=ljfi1,l,x,r+x>=rfi1,r,l,x
j = l = r j=l=r j=l=r的情况
A i − 1 = x , f i , x , x , x = ∑ l &lt; = x ∑ r &gt; = x f i − 1 , x , l , r A_{i-1}=x,f_{i,x,x,x}=\sum_{l&lt;=x}\sum_{r&gt;=x}f_{i-1,x,l,r} Ai1=x,fi,x,x,x=l<=xr>=xfi1,x,l,r
A i − 1 ! = x , f i , x , x , x = ∑ y ! = x ( ∑ k &lt; = y f i − 1 , y , k , x + ∑ k &gt; = y f i − 1 , y , x , k ) A_{i-1}!=x,f_{i,x,x,x}=\sum_{y!=x}(\sum_{k&lt;=y}f_{i-1,y,k,x}+\sum_{k&gt;=y}f_{i-1,y,x,k} ) Ai1!=x,fi,x,x,x=y!=x(k<=yfi1,y,k,x+k>=yfi1,y,x,k)
然后就可以前缀和优化了
[JXOI2017]加法
先二分答案,然后每次贪心加,即把右端点最右的那个区间+1
然后优先队列取区间,树状数组加就可以了
[JXOI2017]颜色
转换为求合法区间 [ L , R ] [L,R] [L,R]的个数
st 表示颜色第一次出现位置,ed表示最后一次出现,pre表示上一次出现位置
[ L , R ] [L,R] [L,R] 合法,当且仅当直接的所有颜色 s t &gt; = L , e d &lt; = R st&gt;=L,ed &lt;=R st>=L,ed<=R
考虑枚举 R 然后查询可行的 L 的个数
对于一个 s t &lt; e d &lt; = R st&lt;ed&lt;=R st<ed<=R 区间 [ s t + 1 , e d ] [st+1,ed] [st+1,ed] 不能作为 L
对于一个 p r e e d &lt; = R &lt; e d pre_{ed}&lt;=R&lt;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,直接弹掉不要

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值