zoukankan      html  css  js  c++  java
  • bzoj4361 isn

    4361: isn

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 44  Solved: 28
    [Submit][Status][Discuss]

    Description

    给出一个长度为n的序列A(A1,A2...AN)。假设序列A不是非降的。你必须从中删去一个数,
    这一操作,直到A非降为止。求有多少种不同的操作方案,答案模10^9+7。

    Input

    第一行一个整数n。
    接下来一行n个整数,描写叙述A。

    Output

    一行一个整数。描写叙述答案。

    Sample Input

    4
    1 7 5 3

    Sample Output

    18

    HINT

    1<=N<=2000

    Source




    用f[i][j]表示以a[i]结尾,长度为j的非降子序列个数,这能够用树状数组优化的DP解决,时间复杂度O(n^2logn)。

    再用g[i]表示长度为i的非降子序列个数,非常显然g[i]=∑f[k][i],时间复杂度O(n^2)。

    然后依据容斥原理。ans=∑((n-i)!*g[i]-(n-i-1)!*g[i+1]*(i+1))。




    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<stack>
    #define F(i,j,n) for(int i=j;i<=n;i++)
    #define D(i,j,n) for(int i=j;i>=n;i--)
    #define ll long long
    #define maxn 2005
    #define mod 1000000007
    using namespace std;
    int n,cnt;
    int a[maxn],b[maxn],bb[maxn];
    ll f[maxn][maxn],g[maxn],fac[maxn],s[maxn][maxn];
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    	while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    	return x*f;
    }
    inline void add(int id,int pos,ll x)
    {
    	for(;pos<=n;pos+=(pos&(-pos))) (s[id][pos]+=x)%=mod;
    }
    inline ll query(int id,int pos)
    {
    	ll ans=0;
    	for(;pos;pos-=(pos&(-pos))) (ans+=s[id][pos])%=mod;
    	return ans;
    }
    int main()
    {
    	n=read();
    	F(i,1,n) a[i]=b[i]=read();
    	sort(b+1,b+n+1);
    	F(i,1,n) if (i==1||b[i]!=b[i-1]) bb[++cnt]=b[i];
    	F(i,1,n) a[i]=lower_bound(bb+1,bb+cnt+1,a[i])-bb;
    	fac[0]=1;
    	F(i,1,n) fac[i]=fac[i-1]*i%mod;
    	add(0,1,1);
    	F(i,1,n) D(j,i,1)
    	{
    		f[i][j]=query(j-1,a[i])%mod;
    		add(j,a[i],f[i][j]);
    	}
    	F(i,1,n) F(j,i,n) (g[i]+=f[j][i])%=mod;
    	ll ans=0;
    	F(i,1,n) ans=(((ans+g[i]*fac[n-i])%mod-g[i+1]*fac[n-i-1]%mod*(i+1)%mod)%mod+mod)%mod;
    	printf("%d
    ",ans);
    }
    


  • 相关阅读:
    解决微信OAuth2.0网页授权回调域名只能设置一个的问题
    js中window.location.search的用法和作用。
    在T-SQL语句中访问远程数据库
    C# 解析 json
    C#后台执行JS
    WhereHows前后端配置文件
    jar打包混淆上传全自动日志
    quartz中设置Job不并发执行
    解决eclipse maven 项目重新下载包这个问题
    Sublime Text 3中文乱码问题解决(最新)
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7382576.html
Copyright © 2011-2022 走看看