再一次被智商压制。。。
#include <iostream> #include<queue> #include<cstdio> #include<cstring> using namespace std; const int maxn=1e5+5; int v[maxn]; long long t[maxn]; long long sum[maxn]; int n; priority_queue<long long,vector<long long >,greater<long long > >q; int main() { while(cin>>n) { memset(t,0,sizeof(t)); memset(sum,0,sizeof(sum)); for(int i=1; i<=n; i++) { scanf("%d",&v[i]); } for(int i=1; i<=n; i++) { scanf("%d",&t[i]); sum[i]=sum[i-1]+t[i]; } for(int i=1; i<=n; i++) { long long ans=0; q.push(v[i]+sum[i-1]); // cout<<"dkvm"; while(!q.empty()&&q.top()<=sum[i]) { ans+=q.top()-sum[i-1]; q.pop(); } ans+=q.size()*t[i]; cout<<ans<<" "; } cout<<endl; } return 0; }
一开始总想着如果当天温度比队列头的体积小要怎么修改一个区间 想了很多方案 二分+线段树 树状数组都考虑了 然而并没有那么麻烦。。。
对于每一天而言 只需要考虑的是队列最前面的是否被融化了就行 如果没有 就直接用权乘以队列的大小 如果有就把队头弹出 只要你在队列插入的是雪的体积和他前一天起的所有光照总和的和就行了 这样就可以完美避开了区间修改的麻烦。。。
前缀和的思想 还有对于优先队列的灵活运用