首页 > 其他分享 >P10592 BZOJ4361 isn

P10592 BZOJ4361 isn

时间:2024-11-11 16:41:26浏览次数:1  
标签:P10592 int sum 非降 序列 长度 BZOJ4361 我们 isn

P10592 BZOJ4361 isn

当一个序列删成非降序列的话那操作就要停止,所以我们要求的是最后一步刚好删成非降序列的操作数,但是这样做太复杂了,我们先不考虑停止操作,让他一直删下去。

这时我们就要知道长度为 \(i\) 的非降序列的数量然后才能计算答案,我们有 \(f_{i,j}\) 为第 \(i\) 个数长度为 \(j\) 的非降序列的长度,我们可以用树状数组优化,比如我们要求以 \(3\) 结尾的长度为 \(2\) 的非降子序列的数量,我们就用树状数组查询小于 \(3\) 的长度 \(1\) 的非降子序列的数量,这样计算的时间复杂度为 \(O(n^2\log n)\)。

接下我我们要统计长度为 \(i\) 的非降序列的总数量,我们有:

\[g_i=\sum_{i=1}^{n}\sum_{j=i}^{n}f_{j,i} \]

现在知道数量如何计算方案数,对于删成一个长度为 \(i\) 的非降序列的方案数为 \((n-i)!\),即删除数的全排列。总的方案数为:

\[ans=\sum_{i=1}^n g_i\times (n-i)! \]

接下来加上停止操作,我们要排除不合法的方案,当我们删除最后一个数使得非降序列长度为 \(i\),我们是从 \(i+1\) 转移过来,但是如果 \(i+1\) 删掉最后一个数使得非降序列长度为 \(i+1\) 的话就会停止操作使得不会再向下传递使我们造成贡献,所以我们要容斥掉那一部分,总计算为:

\[ans=\sum_{i=1}^n g_i\times (n-i)!-g_{i+1}\times (n-i-1)!\times (i+1) \]

乘 \(i+1\) 是因为我们有 \(i+1\) 个数可以作长度为 \(i\) 的非降序列的最后一个删的数。

#include <bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1 
#define fi first
#define se second
#define re register 
#define pir pair<int,int>
const int inf=1e9;
const int N=2e5+10;
const int mod=1e9+7;
using namespace std;

int n;
int a[N];
int b[N];

int f[3005][3005];
int t[3005][3005];
int fac[2005];

int g[N];

int lb(int x){
	return x&-x;
}

void change(int x,int k,int z){
	x++;
	while(x<=2000){
		(t[x][z]+=k)%=mod;
		x+=lb(x);
	}
}

int query(int x,int k){
	x++;
	int ans=0;
	while(x){
		ans+=t[x][k];
		x-=lb(x);
		ans%=mod;
	}
	return ans;
}

void init(){
	fac[0]=1;
	for(int i=1;i<=2000;i++){
		fac[i]=fac[i-1]*i;
		fac[i]%=mod;
	}
	sort(b+1,b+n+1);
	int len=unique(b+1,b+n+1)-b-1;
	for(re int i=1;i<=n;i++){
		a[i]=lower_bound(b+1,b+len+1,a[i])-b;
	}
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr); 
	
	cin>>n;
	
	for(re int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=a[i];
	}
	
	init();	
	
	change(0,1,0);
	f[0][0]=1;
	
	for(int i=1;i<=n;i++){
		for(int j=i;j;j--){
			f[i][j]=query(a[i],j-1);
			change(a[i],f[i][j],j);
		}
	}
	int ans=0;
	
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			(g[i]+=f[j][i])%=mod;
		}
	}
	
	for(int i=1;i<=n;i++){
		int x=g[i]*fac[n-i]%mod;
		int y=g[i+1]*fac[n-i-1]%mod*(i+1)%mod;
		if(i==n){
			y=0;
		}
		ans=(ans+x-y+mod)%mod;	
	}
	cout<<ans;
	return 0;
}

标签:P10592,int,sum,非降,序列,长度,BZOJ4361,我们,isn
From: https://www.cnblogs.com/sadlin/p/18540056

相关文章

  • 如何注册和使用Disney+?Disney+会员账号可以合租?Disney+会员账号订阅购买使用教程
    Disney+是什么,Disney+介绍详情移步至底部参考文章查看哦~Disney+账户分类Disney+的账号分类比较复杂,有国际版、Hotstar版和日本版三种,接下来将分别介绍这三种账号,让你在注册DisneyPlus账号时不再纠结。详情移步至底部参考文章查看哦~国内Disney+使用教程通过上面对Dis......
  • 如何注册和使用Disney+,Disney+会员账号可以合租,Disney+会员账号订阅购买使用教程
    Disney+是什么,Disney+介绍移步至底部原文查看哦~Disney+账户分类详情移步至底部参考文章查看哦~移步至底部原文查看哦~国内Disney+使用教程通过上面对Disney+账号的分类以及分区的讲解,可以发现目前适合中国大陆用户注册的Disney+账号应该还是全球通用版本,虽然价格会贵一......
  • 【simulink】关系操作符isINF, isNaN, isFinite
    isNaN()检查参数是否是非数字,NaN-NOTaNumber不是数字,返回true;是数字,返回false示例:返回false:isNaN(123),isNaN(-1.23),isNaN(6+4),isNaN(0)返回true:isNaN("helloworld"),isNaN('a'),isNaN("2024/9/20")isINF()检查参数是否无穷大正负无穷大时,返回true;否则,返回false......
  • isNaN 与 NumberisNaN
    让我们跳过所有这些……直接进入正题。我喜欢使用number.isnan但今天,我似乎明白了为什么选择它。isnan和number.isnan看起来几乎相同,它们都用于检查值是否为nan。当我们转换或想要将某些值转换为数字时,我们通常会这样做。你什么时候使用这些?当您想知道某个值是否为数字时,请......
  • MYSQL中 IF() IFNULL() NULLIF() ISNULL() 函数的使用
    IF()函数的使用IF(expr1,expr2,expr3),如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。SELECTIF(TRUE,'A','B');--输出结果:ASELECTIF(FALSE,'A','B');--输出结果:BIFNULL()函数的使用IFNULL(expr1,expr2),如果expr1的值为null,则返回......
  • 【StrUtil.isNotEmpty;StrUtil.isNotBlank;StrUtil.isEmpty;StrUtil.isBlank;】的判断区别
    在Java中,StrUtil是一个常用的字符串工具类,通常来自于Hutool库。以下是StrUtil.isNotEmpty(),StrUtil.isNotBlank(),StrUtil.isEmpty()和StrUtil.isBlank()的区别:StrUtil.isNotEmpty(Stringstr):功能:判断字符串是否不为空(即字符串不为null且长度大于0)。示例:StrUtil......
  • django.core.exceptions.ImproperlyConfigured: 'django.contrib.gis.db.backends.mys
     没解决此问题(venv)[root@VM-8-12-centosMYPROJECT-django20240830]#python3manage.py runserver0.0.0.0:8080Exceptioninthreaddjango-main-thread:Traceback(mostrecentcalllast): File"/root/MYPROJECT/backend/venv/lib/python3.8/site-packages/django/d......
  • vue 中 {{ +isNeed ? '是' : '否' }} 什么意思,isNeed是 1 或 0
    在Vue.js中,双花括号{{}}用于插值操作,用来将数据绑定到模板中。在你提供的例子中:{{+isNeed?'是':'否'}}这段代码的意思是:+isNeed将变量isNeed转换为数字类型。因为isNeed是1或0,所以+isNeed将分别转换为数字1或0。?是JavaScript中的条件运算符,用于......
  • Python教程:空值、无穷值判断之isna、isnull、isfinite
    一、空值isnaPands中NaN(Not-A-Number)视为空值,利用函数isna和notna进行判断。注意:不要利用是否等于None判断是否为空!importpandasaspdpd.NA==None#Falsepd.isna(pd.NA)#Truepd.isna(None)#Truepd.notna(pd.NA)#Falsepd.notna(None)#False二、......
  • Disney+家庭订阅解锁无限精彩!组团兔家庭影院新选择,同乐无极限,价更低!
    Disney+ 通过其独特的内容库和品牌优势吸引了大量的用户,特别是家庭用户。目前尚未在中国大陆市场正式运营,尽管在国区的访问需要一些技术手段,但其丰富的内容仍然吸引了不少小伙伴。Disney+ 已经在全球超过100个国家或地区提供服务,其中就包括了香港、台湾、新加坡等中文地区......