题意
首先给出n个数字,第ii个数字为a[i]。接下来进行m次操作,每次操作给出一个数字x,练习者在心中将所有值小于等于x的数字都加x。当进行完这m次操作后,练习者再按顺序给出这n个数字。
解析
- 小于等于x的值都+x,那么至少是倍增的,由于x的上限,最多也不会超过31次,即使每个数字都操作32次也不会超时,因此我们策略就是暴力。
- 仔细查看题目,非负数,因此需要考虑0的情况,a[i]为0,和x为0。如果边弹出边插入,当x为0的时候就会出现死循环。
心得
写题的时候,一定要思考一下取值范围是否真的达到上限,不能被迷惑。另外这个题目在榜里好像不是特别好写,因此我都没去开。
code
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
typedef pair<int,int> pii;
int a[N];
int main(){
int n,m;
priority_queue<pii,vector<pii>,greater<pii>> q;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
q.push({a[i],i});
}
while(m--){
int x;
scanf("%d",&x);
if(!x)continue;
vector<int>v;
while(!q.empty() && q.top().first<=x){
if(q.top().first==0)//防止为0的情况,如果有0存在,那么x会一直操作
{
v.push_back(q.top().second);
}
else{
q.push({q.top().first+x,q.top().second});
}
q.pop();
}
for(int i:v){
q.push({x,i});
}
}
while(!q.empty()){
a[q.top().second]=q.top().first;
q.pop();
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
}