洛谷P3353 【在你窗外闪耀的星星】题解
没错,这是一眼就能看出是打前缀和的水题。但是我高兴的打完后却wa了。(10分)百思不得其解。后来才发现会有重点!!如果有好几个星星在同一个点上那么这个点的亮度是它们的亮度和。然后一遍跑过去就行了。sum[i]表示前i个点的星星亮度和。f[i]表示第i个点的亮度。
#include<bits/stdc++.h> using namespace std; int f[1000005],sum[1000005],n,m,x,y,ans,maxn; int read() { int x=0;char c;bool f; f=false; c=getchar(); if (c=='-') f=true; while (c<'0'||c>'9') c=getchar(); while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); if (f==true) x=x*-1; return x; } struct mmp { int x,y; }a[100005]; bool cmp(mmp x,mmp y) { return x.x<y.x; } int main() { n=read();m=read(); maxn=1; /* for (int i=1;i<=n;i++) {a[i].x=read();a[i].y=read();} sort(1+a,1+a+n,cmp); for (int i=1;i<=n;i++)*/ for (int i=1;i<=n;i++) { x=read();y=read(); f[x]+=y; maxn=max(maxn,x); } for (int i=1;i<=maxn;i++) sum[i]=sum[i-1]+f[i]; ans=-1; for (int i=1;i<=maxn;i++) { ans=max(ans,sum[i]-sum[i-m]); } printf("%d",ans); return 0; }
不用管a数组。。。刚开始以为要sort。。