求分析时间复杂度
查看原帖
求分析时间复杂度
576074
123asdf123楼主2024/4/30 20:01

AC 了,但原题数据好像是随机的,因此不开O2都能过。

但好像不是正解……

#include<bits/stdc++.h>
using namespace std;
namespace estidi{
	int a[50003];
	struct seg_t{
		int l,r,ban,mi,mipos;
	}t[200003];
	void pushup(int x){
		if(t[x*2].ban&&t[x*2+1].ban){
			t[x].ban=1;
			return;
		}
		t[x].ban=0;
		if(t[x*2].ban){
			t[x].mi=t[x*2+1].mi;
			t[x].mipos=t[x*2+1].mipos;
			return;
		}
		if(t[x*2+1].ban){
			t[x].mi=t[x*2].mi;
			t[x].mipos=t[x*2].mipos;
			return;
		}
		t[x].mi=min(t[x*2].mi,t[x*2+1].mi);
		if(t[x*2+1].mi==t[x].mi)
			t[x].mipos=t[x*2+1].mipos;
		else
			t[x].mipos=t[x*2].mipos;
	}
	void build(int l,int r,int x){
		t[x].l=l;
		t[x].r=r;
		if(l<r){
			int mid=(l+r)>>1;
			build(l,mid,x*2);
			build(mid+1,r,x*2+1);
			pushup(x);
		}
		else{
			t[x].ban=0;
			t[x].mi=a[l];
			t[x].mipos=l;
		}
	}
	void ban(int p,int k,int x){
		if(t[x].l>p||t[x].r<p)
			return;
		if(t[x].l==p&&t[x].r==p){
			t[x].ban=k;
			return;
		}
		ban(p,k,x*2);
		ban(p,k,x*2+1);
		pushup(x);
	}
	pair<int,int>ask(int l,int r,int x){
		if(t[x].l>r||t[x].r<l)
			return {2147483647,-1};
		if(t[x].l>=l&&t[x].r<=r){
			if(t[x].ban)
				return {2147483647,-1};
			return {t[x].mi,t[x].mipos};
		}
		pair<int,int>a=ask(l,r,x*2),b=ask(l,r,x*2+1);
		if(a.first==b.first){
			if(a.second>b.second)
				return a;
			return b;
		}
		if(a.first<b.first)
			return a;
		return b;
	}
	set<pair<int,int>>s;
	priority_queue<int,vector<int>,greater<int>>path;
	int n,m,used;
	void getmax(){
		used=0;
		while(path.size())
			path.pop();
//		cerr<<endl<<"original:";
		for(auto x:s){
			if(used+x.first<=m){
				used+=x.first;
//				cerr<<-x.second<<" ";
				path.push(-x.second);
				ban(-x.second,1,1);
			}
			else
				break;
		}
//		cerr<<endl;
	}
	void getarr(){
		int now;
		pair<int,int>x;
		queue<int>rp;
		while(path.size()){
			now=path.top();
			path.pop();
			x=ask(now+1,n,1);
			if(x.second!=-1&&x.first+used-a[now]<=m){
//				cerr<<"change:"<<now<<" to "<<x.second<<endl;
				used=used-a[now]+x.first;
				path.push(x.second);
				ban(x.second,1,1);
				ban(now,0,1);
			}
			else
				rp.push(now);
		}
		while(rp.size()){
			s.erase({a[rp.front()],-rp.front()});
			rp.pop();
		}
	}
	int main(){
		int ans=0;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++){
			scanf("%d",&a[i]);
			s.insert({a[i],-i});
		}
		build(1,n,1);
		while(!t[1].ban){
			getmax();
			getarr();
			ans++;
		}
		printf("%d",ans);
		return 0;
	}
}
int main(){
	estidi::main();
	return 0;
}
2024/4/30 20:01
加载中...