[AGC049D] Convex Sequence
[AGC049D] Convex Sequence
题意
题目写得很清楚。
思路
省流
做原凸包的二阶导数 ,有 。
枚举凸包最低点 ,钦定 一定是最低点最左边的那个点,将 归入左部,将 归入右部。因此左部需要填 个数,其中 为正数。右部需要填 个数。所有 非负。
答案取生成函数的 。
可以使用生成函数来做。
第二个条件就是 ,即 是下凸壳。
下凸壳这个要求不好处理。
我们先考虑只有右下凸壳的情况,即斜率非负。
对原数列做差分数组 ,得到 单调不减。
然而单调不减依然不好维护,对 再做差分数组 ,要求 非负。
然而 是未知的,我们只知道 ,考虑推出 。
换元 。
容易发现 非 的 最大到 。思考一下发现这是符合直觉的。而 的 。
写出生成函数:
每个 可以取值 。对指数的贡献就是
这玩意只关心 项,而且是 个多项式相乘,考虑递推求解。
定义 。
对于每一项系数 有 。
因此得到递推式子 。
由于多项式指数为负的系数总是零,因此无需讨论指数为负的情况。
因此可是通过 的时间从 。
总时间复杂度 。
对于凸壳斜率正负都存在的情况,我们枚举凸壳最低点 ,左右分开算。
本质不同的情况只有 种,而且每次 向右移 的时候,相当于式子乘上或者除以 ,可以类似上面 递推求出新的多项式。
乘上 :。
除以 :。
然后答案取 的系数。
实现的时候发现不好做,因为一个序列可能拥有多个最低点 ,因此会算重。
我的做法是钦定 一定是最低点最左边的那个点。将 归入左部,将 归入右部,因此左部需要填 个数,其中 非零。右部需要填 个数,没有额外限制。
还有一个问题是如果要保证原凸壳的二阶导数非负,就不可以算上最低点位置的二阶导数。因此会造成凸壳整体上移或者下移,二阶导数不变的情况。那么我们可以枚举上移的量,答案加上 。
code
注意实际上 的上界为 ,因为有 。大概是这么写的吧。
#include<bits/stdc++.h> #define sf scanf #define pf printf #define rep(x,y,z) for(int x=y;x<=z;x++) #define per(x,y,z) for(int x=y;x>=z;x--) using namespace std; typedef long long ll; namespace ababab { constexpr int N=1e5+7,mod=1e9+7; int add(int a,int b) { return a+b>=mod ? a+b-mod : a+b; } void _add(int &a,int b) { a=add(a,b); } int n,m; int f[N<<1],_f[N<<1]; int lim; int laa,lab; int ans; void solvemul(int t) { memcpy(_f,f,sizeof(f)); rep(i,0,m<<1) f[i]=add(_f[i],i-t>=0?f[i-t]:0); } void solvediv(int t) { memcpy(_f,f,sizeof(f)); rep(i,0,m<<1) f[i]=add(_f[i],i-t>=0?mod-_f[i-t]:0); } void solvechange(int t) { memcpy(_f,f,sizeof(f)); rep(i,0,m<<1) f[i]=i+t<=(m<<1)?f[i+t]:0; } void solvechange2(int t) { memcpy(_f,f,sizeof(f)); rep(i,0,m<<1) f[i]=i-t>=0?add(_f[i-t],f[i-t]):0; } void main() { sf("%d%d",&n,&m); f[0]=1; lim=ceil(sqrt(m))*2; lab=lim; rep(i,1,lim) solvemul(i*(i+1)/2); rep(a,1,min(n,lim+1)) { int b=n-a; int _a=a-1, _b=min(b,lim); if(laa!=_a) { rep(k,laa+1,_a) { solvechange((k-1)*k/2); solvechange2(k*(k+1)/2); } laa=_a; } if(lab!=_b) { rep(k,_b+1,lab) solvediv(k*(k+1)/2); lab=_b; } for(int j=m;j>=0;j-=n) _add(ans,f[j]); } pf("%d\n",ans); } } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); freopen("my.out","w",stdout); #endif ababab :: main(); }
本文来自博客园,作者:wing_heart,转载请注明原文链接:https://www.cnblogs.com/wingheart/p/18607302
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】