争取恢复一下智商
要不以后头被打下来
施工时间大概无限长
现在还在放假(理不直气也壮)
突然发现自己现在怎么这么沙雕?
代码不贴了,好长啊…
括号树
很明显题目就是要求你加入每次加入一个括号,然后统计以他结尾的合法串又多少个
设为
d
i
d_i
di
括号序列自然就是转化为和为0
然后只有
)
)
)的时候统计贡献就可以了
(突然发现为啥输入法每次打‘统计’第一个都是‘酮基’)
很明显问题是快速找到合法的和他配对的’('就做完了,设这个点为
l
a
s
t
i
last_i
lasti
一开始写了一个很沙雕的东西
if (ss[x]==')')
{
while (ss[last[x]]==')') last[x]=fa[last[last[x]]];
if (last[x]!=0) d[x]=d[fa[last[x]]]+1;
}
基本上就是维护一个邻接表一个一个跳,明显可以卡成
n
2
n^2
n2
然而数据似乎弱的不行,再loj直接A了(应该是官方数据吧?
其实这个只需要维护一个每个点合法的的没有配对的最近的左端点就可以做到稳定
O
(
n
)
O(n)
O(n)
划分
校内好像要训练吓得我赶紧开个题做
我怎么开的第二题就不会做
首先有一个很明显的DP,大概就是
f
i
,
j
f_{i,j}
fi,j表示前
i
i
i个数最后一段是
j
j
j的最优代价
明显
j
j
j的取值有限,可以优化为表示端点
可以很快得到一个
O
(
n
3
)
O(n^3)
O(n3)的做法
观察一下可以发现若
j
j
j固定,
i
i
i递增时可以转移的位置显然递减
维护一个范围最值扫过去就可以优化为
O
(
n
2
)
O(n^2)
O(n2)
然而这个做法状态已经时
n
2
n^2
n2,难以继续
有一个结论,就是让最后一段越小越好
感性理解一下?老年选手也不想证明
于是我们发现可以维护一个
f
i
f_i
fi
表示前
i
i
i个数字,最后一段最短到哪里
满足
[
f
i
,
i
]
>
[
f
f
i
−
1
,
f
i
−
1
]
[f_i,i]>[f_{f_i-1},f_{i-1}]
[fi,i]>[ffi−1,fi−1]
显然也可以维护一个类似指针的东西来快速得到
f
i
f_i
fi
感觉维护
f
i
f_i
fi也挺巧妙的啊…
Emiya 家今天的饭
显然如果没有Yazid的话算个和乘起来就完事了
要满足这人的要求显然要容斥一下
显然至多只有一种食材会不合法,于是暴力枚举哪个不合法
一个朴素的想法是记录我们现在用了多少中烹饪方法,这个食材占了多少
显然不能通过
转化一下条件,就是这个食材所用的烹饪方法不能比其它的总和多
于是作差记录状态就可以了,最后不合法的状态就是>0的那些
具体来说,就是对于每一个食材计算一个
f
i
,
j
f_{i,j}
fi,j表示前
i
i
i 种烹饪方法差为
j
j
j的方案数
显然可以O(1)转移,于是总复杂度就是
O
(
n
2
m
)
O(n^2m)
O(n2m)
格雷码
显然一位一位做过去就可以了…