n*k*log n 求调
查看原帖
n*k*log n 求调
983519
Laisira楼主2024/5/22 17:28

用的线段树在 n×n×kn\times n\times k 算f[i][j]被谁加上,样例都过不了。

#include<bits/stdc++.h>
#define mod 10086001 
#define Maxn 5005 
using namespace std;
int a[Maxn],f[Maxn][Maxn];
struct Tree {
int val[Maxn<<2],lazy[Maxn<<2];
    void merge(int x,int l,int r,int L,int R,int value) {
        if(L<=l&&r<=R) {
            lazy[x]=(lazy[x]+value)%mod;
            val[x]=(val[x]+value*(r-l+1)%mod)%mod;
            return ;
        } int mid=l+r>>1;
        lazy[x<<1]=(lazy[x<<1]+lazy[x])%mod;
        val[x<<1]=(val[x<<1]+lazy[x]*(mid-l+1)%mod)%mod;
        lazy[x<<1|1]=(lazy[x<<1|1]+lazy[x])%mod;
        val[x<<1|1]=(val[x<<1|1]+lazy[x]*(r-mid)%mod)%mod;
        lazy[x]=0;
        if(L<=mid)merge(x<<1,l,mid,L,R,value);
        if(mid<R)merge(x<<1|1,mid+1,r,L,R,value);
        val[x]=val[x<<1]+val[x<<1|1];
    }
    int query(int x,int l,int r,int u) {
        if(l == r)return val[x];
        int mid=l+r>>1,ans=0;
        lazy[x<<1]=(lazy[x<<1]+lazy[x])%mod;
        val[x<<1]=(val[x<<1]+lazy[x]*(mid-l+1)%mod)%mod;
        lazy[x<<1|1]=(lazy[x<<1|1]+lazy[x])%mod;
        val[x<<1|1]=(val[x<<1|1]+lazy[x]*(r-mid)%mod)%mod;
        lazy[x]=0;
        if(u<=mid)ans=query(x<<1,l,mid,u);
        else ans=query(x<<1|1,mid+1,r,u);
        val[x]=val[x<<1]+val[x<<1|1];
        return ans;
    }
    void Memset() {
        memset(val,0,sizeof(val));
        memset(lazy,0,sizeof(lazy));
    }
} tre[2];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,k0;
    cin>>k0>>n;
    f[0][0]=1;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++) {
        tre[!(i&1)].Memset();
        for(int j=0;j<=k0;j++) {
            f[i][j]=tre[(i&1)].query(1,0,k0,j);
            tre[!(i&1)].merge(1,0,k0,j,min(j+a[i+1],n),f[i][j]);
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
        ans=(ans+f[i][k0])%10086001;
    if(!ans)cout<<"impossible";
    else cout<<ans;
    return 0;
}
2024/5/22 17:28
加载中...