博客界面的小人搞不好导致无心写博客
题意:tyd非常喜欢玩雪,下雪下了n天,第i天她会堆一堆大小为Vi的雪堆,但因为天气原因,每堆雪会融化Ti,问每天总共融化了多少雪;
直接上代码+注释
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<math.h> 5 #include<iostream> 6 #define ll long long 7 using namespace std; 8 9 ll a[100100],b[100100],c[1010000],sum[100100],d[100100],e[101000]; 10 11 int ef(int mid,int i) 12 { 13 if(a[i]>c[mid]-c[i-1]) return 1; 14 return 0; 15 } 16 17 int main() 18 { 19 int n; 20 scanf("%d",&n); 21 for(int i=0;i<n;i++) 22 scanf("%lld",&a[i]); 23 for(int i=0;i<n;i++){ 24 scanf("%lld",&b[i]); 25 c[0]=b[0]; 26 if(i) c[i]=c[i-1]+b[i]; 27 } 28 for(int i=0;i<n;i++){ 29 ll l=i,r=n; 30 while(l<r){ 31 int mid=l+r>>1; 32 if(ef(mid,i)) l=mid+1; ///二分找到可以完全融化b[i]的最后一堆; 33 else r=mid; 34 } 35 d[i]++;d[l]--; ///他可以坚持的最后那一堆--; 第1堆++; 36 sum[l]+=(a[i]-c[l-1]+c[i-1]); ///把多(少)的那部分(最后一堆)存在一个数组里 37 } ///如果是少的话就是负数加进去 38 for(int i=0;i<n;i++) 39 e[i]=e[i-1]+d[i]; ///统计每次有多少堆(多的或少的都在sum数组里),每次++只是最开始那堆 所以加起来 多加的部分在l堆就--了; 40 for(int i=0;i<n;i++) 41 printf("%lld ",e[i]*b[i]+sum[i]); ///堆数*每次融化量+多(少)的那部分 42 printf(" "); 43 return 0; 44 }