首页 > 其他分享 >QOJ #4812. Counting Sequence

QOJ #4812. Counting Sequence

时间:2023-02-10 08:11:35浏览次数:67  
标签:4812 int sqrt using 2n Counting QOJ dp define

题面传送门

首先显然有一个\(O(n^2)\)的dp:设 \(f_{i,j}\) 表示当前总和为 \(i\) ,结尾是 \(j\) 的方案数,转移是平凡的。

因为相邻两项差只有 \(1\) ,因此所有 \(a_i\) 和 \(a_1\) 的差不会超过 \(\sqrt {2n}+O(1)\),但是并没有什么用,因为我们不能直接记录每个数和 \(a_1\) 的差值,题目中有\(a_i>0\) 的限制。

观察发现当 \(a_1>\sqrt {2n}\) 的时候\(a\) 是不可能碰到 \(0\) 的,因此可以考虑将两者分开来算。

对于 \(a_1\leq \sqrt{2n}\),直接用 \(O(n^2)\) 的dp,时间复杂度 \(O(n\sqrt n)\)。

对于 \(a_1\geq \sqrt{2n}\) 的部分,可以记 \(dp_{i,j,S}\) 表示到了序列的第 \(i\) 位,当前和 \(a_1\) 的差值是 \(j\) ,总和为 \(S\) 的方案数,答案可以枚举 \(a_1\) 计算。

但是这个是 \(O(n^2)\) 的(雾

发现这种dp方式非常不优雅,可以倒着dp,每次在开头加上一个数,考虑对后面的数会造成什么影响,就可以做到 \(O(n\sqrt n)\) 。

#include<bits/stdc++.h>
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) ((m)*(x-1)+(y))
#define R(n) (rnd()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using ll=long long;using db=double;using lb=long db;using ui=unsigned;using ull=unsigned ll;
using namespace std;const int N=3e5+5,M=1.6e3+5,K=2e3+5,mod=998244353,Mod=mod-1;const db eps=1e-9;const int INF=1e9+7;mt19937 rnd(time(0));
int n,c,k,B;ll f[M][M],Ans,f1[N*2],f2[N*2];
int main(){
	freopen("1.in","r",stdin);
	int i,j;scanf("%d%d",&n,&c);k=sqrt(2*n)+10;B=2*k;
	for(i=1;i<=k;i++) f[i][i]=1;for(i=1;i<=n;i++){
		Me(f[i%B],0);if(i<=k) f[i][i]=1;
		for(j=1;j<=min(i,B);j++)f[i%B][j]=(f[i%B][j]+f[(i-j)%B][j-1]+f[(i-j)%B][j+1]*c)%mod;
	}
	for(i=1;i<=B;i++) Ans+=f[n%B][i];
	f1[n]=1;for(i=1;i<=2*n/(k+1);i++){
		for(j=k+1;j*i<=2*n;j++) Ans+=f1[2*n-j*i];
		Mc(f2,f1);Me(f1,0);
		for(j=0;j<=2*n-i;j++) f1[j]=(f1[j]+f2[j+i]*c)%mod;
		for(j=i;j<=2*n;j++) f1[j]=(f1[j]+f2[j-i])%mod;
	}
	printf("%lld\n",Ans%mod);
}

标签:4812,int,sqrt,using,2n,Counting,QOJ,dp,define
From: https://www.cnblogs.com/275307894a/p/17107691.html

相关文章

  • 【UVA1485】Permutation Counting
    典中典题。由于\(0\lek\len\le1000\),能猜到做法大概是\(n^2\)的动态规划,接下来写方程。以排列长度划分阶段,该长度下\(E\)值划分子问题,容易想到定义\(f[i][j]\)......
  • FZQOJ 1280
    GameTJ(含另类思路)题意:给定$N$个按长度排序的单词。规定接龙的规则为:若$t$是$s$的真前缀,则$s$可以接龙在$t$后面。求最多接龙次数。$N......
  • 计数排序(Counting Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • [qoj4208]Flight to the Ford
    维护两个集合\(S\)和\(T\),表示当前最后一个询问正确/错误时可能的答案初始\(S=[1,10^{9}]\)且\(T=\empty\),每次划分\(\begin{cases}S=S_{1}\cupS_{2}\\T=T_{1}\cupT_{2......
  • POJ--2386 Lake Counting(DFS)
    记录0:332023-1-24http://poj.org/problem?id=3617reference:《挑战程序设计竞赛(第2版)》2.2.3p43DescriptionFJisabouttotakehisN(1≤N≤2,000)cows......
  • 【QOJ 4273】Good Game(分类讨论)(构造)
    GoodGame题目链接:QOJ4273题目大意给你一个01串,每次可以删一个长度为2/3的全0子串或者全1子串。要你构造一种方法把串删空,或者输出无解。思路首先发现这个......
  • 2022,Feature Evaluation for Underwater Acoustic Object Counting and F0 Estimatio
    paperAbstract在执行水声目标检测任务时,需要对目标数N进行计数,当N大于1时进行声源分离,并从分离出的噪声中提取每个目标的运动参数(如轴频或FO)。尽管深度学习方法在图像......
  • ZROJ370 Medium Counting - 区间dp -
    题目链接:http://zhengruioi.com/problem/370题解:考虑对于\(S[l..r]\),如果要符合条件必然是在最高位分成了至少两段(也可能没有分出来,那就继续下一位)\(S[l..k]和S[k+1......
  • ZROJ369 Tiny Counting - 容斥 - 树状数组 -
    题目链接:http://zhengruioi.com/contest/101/problem/369题解:枚举\(i\),表示钦定了\(b\)或者\(d\)位于\(i\)处不妨设是\(b\)位于\(i\)处,\(d\)同理\(a\)......
  • Codeforces 1671 F Permutation Counting 题解
    题目链接把\(p_i>p_{i+1}\)的位置个数称为间隔数首先想到一个暴力做法。从小到大挨个添加1-n中的每个数,注意到添加数i时,只能添加到当前序列的最后11个位置中,否则逆序对数......