【二分+扫描线乱搞】B. Producing Snow
注意二分写法。。。
http://codeforces.com/problemset/problem/923/B
#include<cstdio> #include<string.h> using namespace std; typedef long long ll; const int maxn = 1e5+3; ll a[maxn],b[maxn]; ll sum[maxn]; ll tot[maxn]; int n; ll ans[maxn]; int flag[maxn]; void erfen(int i){ int l=i-1,r=n+1; while(l<r){ int mid=(l+r)>>1; if(sum[mid]-sum[i-1]<=a[i]){ l=mid+1; }else{ r=mid; } } // printf("%d\n",r); ans[r]+=a[i]-(sum[r-1]-sum[i-1]); flag[i]++; flag[r]--; } int main(){ memset(ans,0,sizeof(ans)); memset(flag,0,sizeof(flag)); memset(tot,0,sizeof(tot)); scanf("%d",&n); for(int i =1;i<=n;i++){ scanf("%I64d",&a[i]); } sum[0]=0; for(int i=1;i<=n;i++){ scanf("%I64d",&b[i]); sum[i]=sum[i-1]+b[i]; } for(int i=1;i<=n;i++){ erfen(i); } int cnt=0; for(int i=1;i<=n;i++){ cnt+=flag[i]; tot[i]=cnt*b[i]+ans[i]; } printf("%I64d",tot[1]); for(int i=2;i<=n;i++){ printf(" %I64d",tot[i]); } puts(""); return 0; }