求助

P3957 [NOIP2017 普及组] 跳房子

更新状态,WA,40 ```cpp #include<iostream> #include<cstdio> using namespace std; int w[500001],s[500001],dp[500002],n,d,k,r,l,mid,dz[500002],dl,dr,maxr; const int INF=1<<30; void de(int num) { while (w[dz[dl]]<num && dl<=dr) dl++; } void jo(int num) { while (dp[dz[dr]]<=dp[num] && dl<=dr) dr--; dz[++dr]=num; } bool dp_cheak(int x) { for (int i=1;i<=500001;i++) dz[i]=500001,dp[i]=-INF; int l=max(d-x,1),r=d+x; dp[0]=0; dl=1,dr=0,dz[1]=0; int j=0; for (int i=0;i<=n;i++) { de(w[i]-r); while (w[j]<=w[i]-l && j<=n) { jo(j); j++; } if (dl<=dr) dp[i]=dp[dz[dl]]+s[i]; else if (i!=0) dp[i]=-INF; if (dp[i]>=k) return true; } return false; } int main() { scanf("%d%d%d",&n,&d,&k); for (int i=1;i<=n;i++) { scanf("%d%d",&w[i],&s[i]); r=max(r,w[i]); } l=0; maxr=r; r++; while (l!=r) { mid=(l+r)/2; if (dp_cheak(mid)) r=mid; else l=mid+1; } if (l>maxr) cout<<-1;else cout<<l; return 0; } ```
by 为依相逢 @ 2019-03-06 21:15:01


WA 90 ```cpp #include<iostream> #include<cstdio> using namespace std; int w[500002],s[500002],dp[500002],n,d,k,r,l,mid,dz[500002],dl,dr,maxr; const int INF=1<<30; void de(int num) { while (w[dz[dl]]<num && dl<=dr) dl++; } void jo(int num) { while (dp[dz[dr]]<=dp[num] && dl<=dr) dr--; dz[++dr]=num; } bool dp_cheak(int x) { for (int i=1;i<=500001;i++) dz[i]=500001,dp[i]=-INF; int l=max(d-x,1),r=d+x; dp[0]=0; dl=1,dr=0,dz[1]=0; int j=0; for (int i=0;i<=n;i++) { while (w[j]<=w[i]-l && j<=n) { jo(j); j++; } de(w[i]-r); if (dl<=dr) dp[i]=dp[dz[dl]]+s[i]; else if (i!=0) dp[i]=-INF; if (dp[i]>=k) return true; } return false; } int main() { scanf("%d%d%d",&n,&d,&k); for (int i=1;i<=n;i++) { scanf("%d%d",&w[i],&s[i]); r=max(r,w[i]); } l=0; maxr=r; r++; while (l!=r) { mid=(l+r)/2; if (dp_cheak(mid)) r=mid; else l=mid+1; } if (l>maxr) cout<<-1;else cout<<l; return 0; } ```
by 为依相逢 @ 2019-05-02 21:43:55


上面那个发错代码了。。。 ```cpp #include<iostream> #include<cstdio> using namespace std; int w[500002],s[500002],dp[500002],n,d,k,r,l,mid,dz[500002],dl,dr,maxr; const int INF=1<<30; void de(int num) { while (w[dz[dl]]<num && dl<=dr) dl++; } void jo(int num) { while (dp[dz[dr]]<=dp[num] && dl<=dr) dr--; dz[++dr]=num; } bool dp_cheak(int x) { for (int i=1;i<=500001;i++) dz[i]=500001,dp[i]=-INF; int l=max(d-x,1),r=d+x; dp[0]=0; dl=1,dr=0,dz[1]=0; int j=0; for (int i=0;i<=n;i++) { while (w[j]<=w[i]-l && j<=n) { jo(j); j++; } de(w[i]-r); if (dl<=dr) dp[i]=dp[dz[dl]]+s[i]; else if (i!=0) dp[i]=-INF; if (dp[i]>=k) return true; } return false; } int main() { scanf("%d%d%d",&n,&d,&k); for (int i=1;i<=n;i++) { scanf("%d%d",&w[i],&s[i]); r=max(r,w[i]); } l=0; maxr=r; r++; while (l!=r) { mid=(l+r)/2; if (dp_cheak(mid)) r=mid; else l=mid+1; } if (l>maxr) cout<<-1;else cout<<l; return 0; } ```
by 为依相逢 @ 2019-05-02 21:51:54


|