2 条题解
-
0Guest LV 0 MOD
-
1
未用差分数组,但速度无影响.
#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
来一组暴力,当然用了前缀和优化。可以过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%
- 上传者