蓝桥杯c组b爬山用的线段树,在c语言网满分,欢迎来hack
#include<iostream>
#include<cmath>
using namespace std;
int n,p,q,h[100005];
struct node
{
int l,r;
long long sum;
int indx;
}tr[400005];
void putup(int u)
{
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
if(tr[tr[u<<1].indx].sum>tr[tr[u<<1|1].indx].sum) tr[u].indx=tr[u<<1].indx;
else tr[u].indx=tr[u<<1|1].indx;
}
void build(int u,int l,int r)
{
if(l==r)
{
tr[u]={l,r,h[l],u};
return;
}
tr[u]={l,r};
int mid=l+r>>1;
build(u<<1,l,mid);build(u<<1|1,mid+1,r);
putup(u);
}
void modify(int u)
{
if(u==0) return;
putup(u);
modify(u>>1);
}
int main()
{
cin>>n>>p>>q;
for(int i=1;i<=n;i++)
{
cin>>h[i];
}
build(1,1,n);
while(p>0||q>0)
{
long long x=sqrt(tr[tr[1].indx].sum);
long long y=tr[tr[1].indx].sum/2;
if(x<y&&p>0)
{
tr[tr[1].indx].sum=x;
modify(tr[1].indx>>1);
p--;
}
else if(x>=y&&q>0)
{
tr[tr[1].indx].sum=y;
modify(tr[1].indx>>1);
q--;
}
else if(p>0&&q==0)
{
tr[tr[1].indx].sum=x;
modify(tr[1].indx>>1);
p--;
}
else if(q>0&&p==0)
{
tr[tr[1].indx].sum=y;
modify(tr[1].indx>>1);
q--;
}
}
cout<<tr[1].sum<<endl;
return 0;
}
以为优先队列时间复杂度是n考试的时候没用,没想到也能全过,时间复杂度也是logn
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
int n,p,q;
priority_queue<int> h;
int main()
{
cin>>n>>p>>q;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
h.push(x);
}
while(p>0||q>0)
{
long long x=sqrt(h.top());
long long y=h.top()/2;
if(x<y&&p>0)
{
h.pop();
h.push(x);
p--;
}
else if(x>=y&&q>0)
{
h.pop();
h.push(y);
q--;
}
else if(p>0&&q==0)
{
h.pop();
h.push(x);
p--;
}
else if(q>0&&p==0)
{
h.pop();
h.push(y);
q--;
}
}
long long sum=0;
while(h.size())
{
sum+=h.top();
h.pop();
}
cout<<sum<<endl;
return 0;
}