从 52 个数据开始就 TLE
查看原帖
从 52 个数据开始就 TLE
178195
人间温柔楼主2022/7/30 17:53

请问是我的线段树的代码还可以优化嘛,或者说我的思路有问题?

#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;
}
2022/7/30 17:53
加载中...