首页 > 其他分享 >[AGC049D] Convex Sequence 题解

[AGC049D] Convex Sequence 题解

时间:2023-12-08 15:26:03浏览次数:37  
标签:ch Sequence int 题解 sqrt AGC049D long inc define

题目链接

点击打开链接

题目解法

好题!!
考虑原题的限制相当于原序列下凸,即差分数组单调
考虑把原序列在第一个最小值处割成 \(2\) 半
因为原序列是凸的,所以非最小值的长度是 \(\sqrt {2m}\) 级别的
这可以让我们 \(dp\) 差分数组,即求满足 \(\sum\limits_{i=1}^{n'}ib_i=m'\) 的 \(b_i\) 个数,\(b\) 是单调不升的

单调的数组有一个比较套路的 \(dp\) 方法是:
当前有 \(i\) 个数,有 \(2\) 个操作是:加入一个 \(1\) 或 把每个数都 \(+1\)
这不难做到 \(O(m\sqrt m)\) 求出 \((n',m')\) 的满足条件的 \(b\) 序列个数

然后考虑合并两端的序列,考虑令 \(g_{i,j}\) 为右部有不超过 \(i\) 个数,和为 \(j\),和包含了 \(n\times \min\) 的方案数
这不难用前缀和优化在 \(O(m\sqrt m)\) 的时间内求出

求答案是好求的,直接枚举左部的长度和 \(sum\) 即可

时间复杂度 \(O(m\sqrt m)\)

#include <bits/stdc++.h>
#define F(i,x,y) for(int i=(x);i<=(y);i++)
#define DF(i,x,y) for(int i=(x);i>=(y);i--)
#define ms(x,y) memset(x,y,sizeof(x))
#define SZ(x) (int)x.size()-1
#define pb push_back
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair<int,int> pii;
template<typename T> void chkmax(T &x,T y){ x=max(x,y);}
template<typename T> void chkmin(T &x,T y){ x=min(x,y);}
inline int read(){
    int FF=0,RR=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
    for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
    return FF*RR;
}
const int N=100100,P=1e9+7;
int n,m,f[455][N],g[455][N];
inline void inc(int &x,int y){ x+=y;if(x>=P) x-=P;}
int main(){
    n=read(),m=read();
    int B=sqrt(m<<1)+5;
    f[0][0]=1;
    F(i,1,B) F(j,0,m){
        if(j>=i) f[i][j]=f[i-1][j-i];
        if(j>=i*(i+1)/2) inc(f[i][j],f[i][j-i*(i+1)/2]);
    }
    F(i,0,B) F(j,0,m){
        if(j>=n) g[i][j]=g[i][j-n];
        inc(g[i][j],f[i][j]);
    }
    F(i,1,B) F(j,0,m) inc(g[i][j],g[i-1][j]);
    int ans=0;
    F(i,0,min(n-1,B)) F(j,0,m) inc(ans,1ll*f[i][j]*g[min(n-i-1,B)][m-j]%P);
    printf("%d\n",ans);
    fprintf(stderr,"%d ms\n",int(1e3*clock()/CLOCKS_PER_SEC));
    return 0;
}

标签:ch,Sequence,int,题解,sqrt,AGC049D,long,inc,define
From: https://www.cnblogs.com/Farmer-djx/p/17888229.html

相关文章

  • dict( [1,2] ) # TypeError: cannot convert dictionary update sequence element
    dict([1,2])#TypeError:cannotconvertdictionaryupdatesequenceelement#0toasequence#listtupleset都可以,并且list(list([1,2]))==[1,2]#仍然是[1,2]list({"key":"value"})#只保留键名......
  • [ARC165E] Random Isolation 题解
    题目链接点击打开链接题目解法略有些套路的概率题,不过中间的把操作序列看成排列的操作还是很妙的首先套路的考虑期望的线性性,有两个方式:把贡献放在点上或点集上,这里采用后面的方式做对于每一个树上的集合\(S\),假设大小为\(n\),相邻的点为\(m\)考虑这个集合独立的限制为:相......
  • Emiya今天的饭 题解
    题目考虑条件主要食材最大的不超过总菜数的一半,不好处理,但存在主要食材最大的超过总菜数的一半是好处理的,容斥即可。首先计算所有情况,由于题目要求每个烹饪方式最多使用一次,很明显可以记\(g_i\)表示前\(i\)种烹饪方式的方案数。\[g_i=g_{i-1}+g_{i-1}\times\sum_{j=1}^......
  • 虚拟机运行Hadoop | 各种问题解决的心路历程
    ps:完成大数据技术实验报告的过程,出项各种稀奇古怪的问题。(知道这叫什么吗?经济基础决定上层建筑,我当时配置可能留下了一堆隐患,总之如果有同样的问题,希望可以帮到你)一、虚拟机网络连接不通的各种情况我这里遇到的是,三台虚拟机,两台piing百度不同原因:改了下内存,重启就又未知的网......
  • 【luogu题解】U388218 数数
    数数题目描述给定n个不超过1.5×10⁹的自然数。求这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。输入格式输入的第1行是整数n,表示自然数的个数。第2行到第n+1行每行一个自然数。输出格式输出文件包含m行(m为n个自然数中不相同数的个......
  • [ARC121F] Logical Operations on Tree 题解
    题目链接点击打开链接题目解法比较好的题首先要发现一个性质是:先删AND边,再删OR边最优小证一下:分类讨论AND边两端的数字情况\(0\&0\)左右两端虽然可能可以把\(1\)OR过来,但这种情况先做\(\&\),也一定可以OR得到\(1\)\(0\&1\)左边可能可以\(OR\)得到\(1......
  • T403510 平面划分(Hard) 题解
    LinkT403510平面划分(Hard)Question平面上由\(n\)条这样的折线所界定区域的最大的个数\(Z_n\)是多少。Solution先思考一个简单的问题平面上\(n\)条直线所界定的区域最大个数\(L_n\)是多少?我们考虑假设已经有\(n-1\)条直线,我们需要画一条直线,这条直线最多和\(n......
  • 【题解】CodeForces 1902F Trees and XOR Queries Again
    传送门:https://codeforces.com/contest/1902/problem/F数据结构题,这里讲两种思路。$ST$表思路:判定“从若干个数中能否取出其中一些,使得异或和为$x$”的问题,第一时间想到线性基,本题要做的显然就是快速求出询问路径上所有数的线性基。两组数的线性基可以合并,方法为“暴力将......
  • [ARC106E] Medals 题解
    题目链接题目链接题目解法感觉不难啊,怎么想到网络流和\(hall\)定理后面就屁都没想到呢首先一眼网络流先二分答案考虑一个朴素的建图方法是:把每个人拆成\(k\)个点,然后往在的天连边,跑最大流,满流即合法可以发现,跑网络流对这道题还说没有必要,因为只要判是否有完美匹配不难......
  • 【UVA 101】The Blocks Problem 题解(模拟+向量)
    计算机科学的许多领域使用简单、抽象的领域进行分析和实证研究。例如,早期的人工智能规划和机器人研究(STRIPS)使用了一个区块世界,其中机器人arm执行涉及块操作的任务。在这个问题中,您将在某些规则和约束下对一个简单的块世界进行建模。相当地与确定如何达到指定状态相比,您将“编程......