请问是我的线段树的代码还可以优化嘛,或者说我的思路有问题?
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;
long long ans,sum;
int id,cnt;
int n,k;
long long a[maxn],b[maxn];
long long mn[maxn<<2];
int top,st[maxn];
struct node{
long long sum;
int id;
bool operator < (const node &x)const {
return sum>x.sum;
}
};
priority_queue<node> q;
void pushup(int pos){
mn[pos]=min(mn[pos<<1],mn[pos<<1|1]);
}
void build(int pos,int l,int r){
if(l==r){
mn[pos]=b[l];
return;
}
int mid=(l+r)>>1;
build(pos<<1,l,mid);
build(pos<<1|1,mid+1,r);
pushup(pos);
}
int query(int pos,int l,int r,int ql,long long x){
if(ql<=l){
if(mn[pos]>x) return 0;
if(l==r) return l;
}
int mid=(l+r)>>1;
if(ql<=mid){
int t=query(pos<<1,l,mid,ql,x);
if(t!=0) return t;
}
return query(pos<<1|1,mid+1,r,ql,x);
}
void dfs(int l,long long res) {
if(res==0){
cnt--;
if(cnt==0){
for(int i=1;i<=top;i++){
cout<<st[i]<<" ";
}
exit(0);
}
}
for(int i=l+1;i<=n;i++){
i=query(1,1,n,i,res);
if(i==0) return;
st[++top]=i;
dfs(i,res-b[i]);
top--;
}
}
int main(){
cin>>n>>k;
k--;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(a+1,a+n+1);
q.push({a[1],1});
while(k--){
long long val=q.top().sum;
if(val==ans) cnt++;
else{
ans=val;
cnt=1;
}
id=q.top().id;
q.pop();
if(id+1<=n){
q.push({val+a[id+1],id+1});
q.push({val+a[id+1]-a[id],id+1});
}
}
cout<<ans<<endl;
build(1,1,n);
dfs(0,ans);
return 0;
}