2 条题解

  • 1
    @ 2017-10-12 16:03:38

    未用差分数组,但速度无影响.
    #include<bits/stdc++.h>
    using namespace std;
    int m,n,t;
    struct node
    {
    int left,num;
    }ans[1001];
    int a[1001],tt[1001];
    inline const void read(int &a)
    {
    a=0;
    int k=1;
    char c=getchar();
    while(c<'0'||c>'9')
    {
    if(c=='-')
    k=-1;
    c=getchar();
    }
    while(c<='9'&&c>='0')
    {
    a=(a<<1)+(a<<3)+c-'0';
    c=getchar();
    }
    a*=k;
    }
    int main()
    {
    cin>>n>>m>>t;
    for(int i=1;i<=m;i++)
    {
    for(int j=0;j<=1001&&ans[j].left;j++)
    {
    ans[j].left=0;
    ans[j].num=0;
    }
    int front=0,rail=0,MAX=0;
    for(int j=1;j<=n;j++)
    {
    read(a[j]);
    if(ans[j-1].num==0&&ans[j-1].left==0)
    {
    ans[j].left=j;
    ans[j].num=a[j];
    MAX=a[j];
    front=j;
    rail=j;
    }
    else if(ans[j-1].num<0)
    {
    ans[j].left=j;
    ans[j].num=a[j];
    if(MAX<=ans[j].num)
    {
    MAX=ans[j].num;
    front=j;
    rail=j;
    }
    }
    else if(ans[j-1].num>=0)
    {
    if(j-ans[j-1].left<=t-1)
    {
    ans[j].left=ans[j-1].left;
    ans[j].num=ans[j-1].num+a[j];
    if(ans[j].num>=MAX)
    {
    MAX=ans[j].num;
    front=ans[j].left;
    rail=j;
    }

    }
    else if(j-ans[j-1].left>t-1)
    {
    int ks=ans[j-1].num+a[j],MAX1=-100000,kt;
    for(int ss=ans[j-1].left;ss<j;ss++)
    {
    ks-=a[ss];
    if(ks>MAX1)
    {
    MAX1=ks;
    kt=ss;
    }
    }
    ans[j].num=max(MAX1,a[j]);
    if(ans[j].num==a[j])
    ans[j].left=j;
    else ans[j].left=kt+1;
    if(ans[j].num>=MAX)
    {
    MAX=ans[j].num;
    front=ans[j].left;
    rail=j;
    }
    }
    }
    }
    for(int j=front;j<=rail;j++)
    tt[j]++;
    }

    for(int i=1;i<=n;i++)
    cout<<tt[i]<<' ';
    cout<<endl;
    return 0;
    }

  • 0
    @ 2017-10-12 00:09:10

    来一组暴力,当然用了前缀和优化。可以过60分。
    #include<bits/stdc++.h>
    const int maxn=1e5+1;
    int main()
    {
    int n,m,t,a[maxn],ex[maxn],ans[maxn];
    memset(ans,0,sizeof(ans));
    std::cin>>n>>m>>t;
    while(m)
    {
    int l=0,r=0;
    ex[0]=0;
    for(int i=1;i<=n;i++)
    {
    scanf("%d",&a[i]);
    ex[i]=ex[i-1]+a[i];
    }
    for(int i=0;i<=n;i++)
    for(int j=i;j<=std::min(i+t,n);j++)
    {
    if(ex[j]-ex[i]>ex[r]-ex[l]){l=i;r=j;}
    else if(ex[j]-ex[i]==ex[r]-ex[l]&&j-i>r-l){l=i;r=j;}

    }
    if(r)for(int i=l+1;i<=r;i++)ans[i]++;
    m--;
    }
    for(int i=1;i<=n;i++){printf("%d",ans[i]);putchar(' ');}
    return 0;
    }
    再来一组暴力,加上了差分数组,70分,多一个点(感谢LXWY同学提供)
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<cstdio>
    using namespace std;
    #define maxn 10010
    int a[maxn];
    int n,m,t;
    int pre[maxn];
    int c[maxn];//差分优化
    int ans[maxn];

    int read()
    {
    int x=0;
    int 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;

    }
    int main()
    {
    cin>>n>>m>>t;
    memset(c,0,sizeof(c));
    while(m--)
    {
    int maxm=0;
    int l=0,r=0;
    pre[0]=0;
    for(register int i=1;i<=n;i++)
    {
    a[i]=read();
    pre[i]=pre[i-1]+a[i];
    }
    for(register int i=0;i<n;i++)
    {
    for(register int j=i;j<=min(n,i+t);j++)
    {
    int temp=pre[j]-pre[i];
    if(temp>maxm)
    {
    l=i;
    r=j;
    maxm=temp;
    }
    if(temp==maxm)
    {
    if(j-i>r-l)
    {
    l=i;
    r=j;
    }

    }
    }
    }

    c[l+1]++;
    c[r+1]--;
    }
    ans[0]=0;

    for(register int i=1;i<=n;i++)
    {
    ans[i]=ans[i-1]+c[i];
    }

    for(register int i=1;i<=n;i++)
    {
    printf("%d ",ans[i]);
    }
    return 0;
    }
    来一组正解(LXWY的提醒,我发现树状数组白写了,用最简单的差分数组就可以了)
    #include<bits/stdc++.h>
    const int maxn=1e5;
    inline const void read(int &a)
    {
    char c=getchar();int b=1;a=0;
    while(c<'0'||c>'9'){if(c=='-')b=-1;c=getchar();}
    while(c>='0'&&c<='9')
    {
    a=(a<<1)+(a<<3)+c-'0';
    c=getchar();
    }
    a*=b;
    }
    inline const void write(int a)
    {
    if(a<0){putchar('-');a=-a;}
    if(a>9)write(a/10);
    putchar(a%10+'0');
    }
    inline const int lowbit(int a)
    {
    return a&(-a);
    }
    int sum[maxn],n,m,t;
    inline const void modify(int a,int b)
    {
    while(a<=n)
    {
    sum[a]+=b;
    a+=lowbit(a);
    }
    }
    inline const int query(int a)
    {
    int ans=0;
    while(a)
    {
    ans+=sum[a];
    a-=lowbit(a);
    }
    return ans;
    }
    struct monotonous_queue
    {
    int que[maxn],start,end,loc[maxn];
    inline const void init(){start=0;end=0;que[0]=loc[0]=0;}
    inline const void push(int a,int i)
    {
    que[++end]=a;loc[end]=i;
    while(end>start&&a<que[end-1]){que[--end]=a;loc[end]=i;}
    }
    inline const void pop(int i)
    {
    if(loc[start]==i)start++;
    }
    }s;
    int a[maxn],ex[maxn],l,r;
    int main()
    {
    read(n);read(m);read(t);
    memset(sum,0,sizeof(sum));
    ex[0]=0;
    while(m)
    {
    s.init();l=r=0;
    for(int i=1;i<=n;i++)
    {
    read(a[i]);
    ex[i]=ex[i-1]+a[i];
    s.pop(i-t-1);
    s.push(ex[i],i);
    if(ex[i]-s.que[s.start]>ex[r]-ex[l])
    {
    r=i;
    l=s.loc[s.start];
    }
    else
    if(ex[i]-s.que[s.start]==ex[r]-ex[l]&&i-s.loc[s.start]>r-l)
    {
    r=i;
    l=s.loc[s.start];
    }
    }
    if(r){modify(l+1,1);modify(r+1,-1);}
    m--;
    }
    for(int i=1;i<=n;i++){write(query(i));putchar(' ');}
    return 0;
    }

  • 1

信息

难度
9
分类
(无)
标签
(无)
递交数
43
已通过
3
通过率
7%
上传者