[二分+(优先队列|前缀和)]Producing Snow CodeForces - 948C

题干 给定长度n(n<=1e5),第一行v[i]表示表示第i堆雪的体积,第二行t[i]表示第1~i天的雪将要消融的体积,一堆雪如果消融到体积为0则消失,求每天消融的雪的体积。
首先是优先队列的…..

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <queue>
#include <stack>
using namespace std;
typedef long long ll;

const int INF=0x3f3f3f3f;
const int maxn=1e5+5;
int n,m,c1,c2,v,q;
ll T[maxn],V[maxn],ST[maxn];

int main(){
    ST[0]=0;
    while(cin>>n){
        for(int i=1;i<=n;i++) cin>>V[i];
        for(int i=1;i<=n;i++) cin>>T[i];
        for(int i=1;i<=n;i++) ST[i]=ST[i-1]+T[i];

        priority_queue<ll,vector<ll>,greater<ll> > Q;

        for(int i=1;i<=n;i++){
            Q.push(V[i]+ST[i-1]);// 每次都加上 T的前缀和 让ST[i-1]消除 i前天的多的温度 
            ll res=T[i]*Q.size();// 这个时候还存在的雪堆默认都够消融 乘温度 接着进入while中去找不够的 
            while(!Q.empty()&&Q.top()<=ST[i]){//找雪不够融的天 pop掉 并且 那天多加的 减去 
                res+=(Q.top()-ST[i]);// 这里top是本来的-ST[i] 变成我们多加上的 减去即可 
                Q.pop();
            }
            if(i!=1) cout<<" ";
            cout<<res;
        }cout<<endl; 
    }
    return 0;
}

接下来是 练习手写二分 其实可以lower_bound

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <list>
#include <bitset>
using namespace std;
typedef long long ll;

const int maxn=1e5+10;

ll V[maxn],T[maxn],ST[maxn];
ll Q[maxn],RE[maxn];
int n;

int main(){
    ST[0]=0;
    V[0]=0;
    T[0]=0;
    while(cin>>n){
        memset(Q,0,sizeof(Q));
        memset(RE,0,sizeof(RE));
        for(int i=1;i<=n;i++) cin>>V[i];
        for(int i=1;i<=n;i++) cin>>T[i];
        for(int i=1;i<=n+10;i++) ST[i]=ST[i-1]+T[i];

        for(int i=1;i<=n;i++){
        // Q[i]++;
            ll L=i-1,R=n+10;
            while(R-L>1){//白书还是耐用。。。。。
                ll m=(R+L)>>1;
            // cout<<L<<" "<<R<<" "<<m<<endl;
                if(V[i]<=(ST[m]-ST[i-1])) R=m;
                else L=m;
            }
        // cout<<" DAS "<<R<<endl;
            Q[i]++,Q[R]--;//第一次使用神奇操作 来记录那天可以有多少堆
            RE[R]+=(V[i]-(ST[R-1]-ST[i-1])); 
        }
    // for(int i=0;i<=n;i++) 
        for(int i=1;i<=n;i++){
            Q[i]=Q[i-1]+Q[i];
            if(i!=1) cout<<" ";
            cout<<Q[i]*T[i]+RE[i];
        }cout<<endl;
    }
    return 0;
}
全部评论

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务