关于n的范围的一点疑惑
查看原帖
关于n的范围的一点疑惑
213750
小树苗楼主2021/2/15 21:13

此代码AC

#include<bits/stdc++.h>
using namespace std;
const int N=10090+5,K=505,lit=5500+5;
int sum[lit][K];
int f[N][K];
int h[N],m;
void add(int x,int y,int v)
{
    for(;x<=lit;x+=(x&-x))
    {
        int k=y;
        for(;k<=m+1;k+=(k&-k))
        sum[x][k]=max(sum[x][k],v);
    }
}
int find(int x,int y)
{
    int res=0;
    for(;x;x-=(x&-x))
    {
        int k=y;
        for(;k;k-=(k&-k))
        res=max(res,sum[x][k]);
    }
    return res;
}
int main()
{
    int n;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    scanf("%d",&h[i]);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m+1;j++)
            f[i][j]=find(h[i]+j,j)+1;
        for(int j=1;j<=m+1;j++)
            add(h[i]+j,j,f[i][j]);
    }
    printf("%d",find(lit,m+1));
    return 0;
}

此代码只AC第一个点,其余全WA

#include<bits/stdc++.h>
using namespace std;
const int N=10000+5,K=505,lit=5500+5;
int sum[lit][K];
int f[N][K];
int h[N],m;
void add(int x,int y,int v)
{
    for(;x<=lit;x+=(x&-x))
    {
        int k=y;
        for(;k<=m+1;k+=(k&-k))
        sum[x][k]=max(sum[x][k],v);
    }
}
int find(int x,int y)
{
    int res=0;
    for(;x;x-=(x&-x))
    {
        int k=y;
        for(;k;k-=(k&-k))
        res=max(res,sum[x][k]);
    }
    return res;
}
int main()
{
    int n;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    scanf("%d",&h[i]);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m+1;j++)
            f[i][j]=find(h[i]+j,j)+1;
        for(int j=1;j<=m+1;j++)
            add(h[i]+j,j,f[i][j]);
    }
    printf("%d",find(lit,m+1));
    return 0;
}

只改了个N的大小,但是 明明比题目的大小要大啊,而且把N改的太大也会RE, MIHUO

#include<bits/stdc++.h>
using namespace std;
const int N=10500+5,K=505,lit=5500+5;
int sum[lit][K];
int f[N][K];
int h[N],m;
void add(int x,int y,int v)
{
    for(;x<=lit;x+=(x&-x))
    {
        int k=y;
        for(;k<=m+1;k+=(k&-k))
        sum[x][k]=max(sum[x][k],v);
    }
}
int find(int x,int y)
{
    int res=0;
    for(;x;x-=(x&-x))
    {
        int k=y;
        for(;k;k-=(k&-k))
        res=max(res,sum[x][k]);
    }
    return res;
}
int main()
{
    int n;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    scanf("%d",&h[i]);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m+1;j++)
            f[i][j]=find(h[i]+j,j)+1;
        for(int j=1;j<=m+1;j++)
            add(h[i]+j,j,f[i][j]);
    }
    printf("%d",find(lit,m+1));
    return 0;
}
2021/2/15 21:13
加载中...