zoukankan      html  css  js  c++  java
  • BZOJ4361 isn

    感觉是个好题

    Description

    link

    去链接看吧

    Solution

    首先定义两个状态:

    (f_{i,j}) 表示长度为 (i) 最后一位在 (j) 的不降子序列个数

    (g[i]=sumlimits_{j=1}^{n} f[i][j]) ,也就是长度 (i) 的不降序列个数

    对于如何转移 (f)

    (1 ightarrow i-1) 中找小于 (a_i) 的数,然后统计答案

    (O(n^3)) 显然无法接受

    我们用树状数组优化这个过程,有点像二维数点

    把复杂度降下来到(O(n^2log n))

    统计 (g) 的答案:

    留下长度为 (i Leftrightarrow) 去掉长度为 (n-i)

    有序的计数,应该是 (ans=sumlimits_{i=1}^{n} g[i] imes (n-i)!)

    但是我们发现在删掉 (i-1) 的时候可能就停下来了

    所以我们要容斥这个过程

    我们发现在一个 (i+1) 的合法序列中删掉任何一个都可以得到合法长度为 (i) 的序列

    然后就直接(ans=sumlimits_{i=1}^{n} g_i imes (n-i)!-(n-i-1)!(i+1)g_{i+1})

    Code

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    namespace yspm{
    	inline int read()
    	{
    		int res=0,f=1; char k;
    		while(!isdigit(k=getchar())) if(k=='-') f=-1;
    		while(isdigit(k)) res=res*10+k-'0',k=getchar();
    		return res*f;
    	}
    	const int mod=1e9+7,N=2010;
    	int c[N],b[N],a[N],f[N][N],g[N],n,m,ans,fac[N];
    	inline int lowbit(int x){return x&(-x);}
    	inline void add(int x,int y)
    	{
    		for(;x<=m;x+=lowbit(x)) c[x]+=y,c[x]%=mod;;
    		return ; 
    	}
    	inline int ask(int x)
    	{
    		int res=0;
    		for(;x;x-=lowbit(x)) res+=c[x],res%=mod;
    		return res;
    	}
    	inline void clear(){for(int i=1;i<=n;++i) c[i]=0; return ;}
    	signed main()
    	{
    		n=read(); for(int i=1;i<=n;++i) b[++m]=a[i]=read();
    		fac[0]=1; for(int i=1;i<=n;++i) fac[i]=fac[i-1]*i%mod;
    		sort(b+1,b+m+1); m=unique(b+1,b+n+1)-b-1;
    		for(int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+m+1,a[i])-b;
    		for(int i=1;i<=n;++i) f[1][i]=1;
    		for(int i=1;i<=n;++i)
    		{
    			clear();
    			for(int j=1;j<=n;++j)
    			{
    				f[i][j]+=ask(a[j]); f[i][j]%=mod;
    				add(a[j],f[i-1][j]);
    			}
    		}
    		for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) g[i]+=f[i][j],g[i]%=mod;
    		for(int i=n;i>=1;--i) 
    		{
    			ans+=g[i]*fac[n-i]%mod; ans%=mod;
    			ans-=g[i+1]*fac[n-i-1]%mod*(i+1)%mod;
    			(ans+=mod)%=mod;
    		}
    		printf("%lld
    ",ans);
    		return 0;
    	}
    }
    signed main(){return yspm::main();}
    
  • 相关阅读:
    Android开发与Sequoyah的安装问题
    Discuz 数据库各表的作用
    jQuery-File-Upload $(...).fileupload is not a function $.widget is not a function
    phpstorm xdebug 无法断点调试问题
    Android Service 启动流程
    Discuz! 全局变量说明
    Discuz! X3 数据表、数据字段说明
    Spring Boot 搭建
    Android组件化开发(注意事项)
    NestedScrollView嵌套RecycleView发生的小问题
  • 原文地址:https://www.cnblogs.com/yspm/p/12790627.html
Copyright © 2011-2022 走看看