why RE,玄关
查看原帖
why RE,玄关
917683
rnf5114楼主2025/1/9 12:12
#include<bits/stdc++.h>
using namespace std;
int ans,n,m,cnt=1,vis[50010],b[50010],y[50010],w[50010],Y[50010];
struct node{
	int v,id;
}a[50010];
bool cmp(node x,node y){
	if(x.id==y.v)
		return x.id>y.id;
	return x.v<y.v;
}
map<int,int>M;
pair<int,int> t[200010];
set<int>s[200010];
int calc1(int x){
	int l=1,r=cnt,tmp=cnt+1;
	while(l<=r){
		int mid=(l+r)/2;
		if(w[mid]>=x)
			r=mid-1,tmp=min(tmp,mid);
		else
			l=mid+1;
	}
	return tmp;
}
int calc2(int x){
	int l=1,r=cnt,tmp=0;
	while(l<=r){
		int mid=(l+r)/2;
		if(w[mid]<=x)
			l=mid+1,tmp=max(tmp,mid);
		else
			r=mid-1;
	}
	return tmp;
}
void pushup(int id){
	if(t[id*2].first>=t[id*2+1].first)
		t[id]=t[id*2];
	else
		t[id]=t[id*2+1];
}
void build(int l,int r,int id){
	if(l==r){
		int tmp=Y[l];
		t[id].first=*s[M[tmp]].begin();
		t[id].second=a[tmp].v;
		return ;
	}
	build(l,(l+r)/2,id*2);
	build((l+r)/2+1,r,id*2+1);
	pushup(id);
}
pair<int,int> query(int ql,int qr,int l,int r,int id){
	if(ql>qr||r<ql||l>qr)
		return make_pair(0,0);
	if(l>=ql&&r<=qr)
		return t[id];
	pair<int,int>tmp1=query(ql,qr,l,(l+r)/2,id*2),tmp2=query(ql,qr,(l+r)/2+1,r,id*2+1);
	if(tmp1.first>=tmp2.first)
		return tmp1;
	return tmp2;
}
void modify(int l,int r,int ql,int qr,int k,int id){
	if(l>qr||r<ql||l>r)
		return ;
	if(l>=ql&&r<=qr){
		t[id].first=k;
		return ;
	}
	modify(l,(l+r)/2,ql,qr,k,id*2),modify((l+r)/2+1,r,ql,qr,k,id*2+1);
	pushup(id);
	return ;
}
void work(int x){
	int tmp=m,Max;
	priority_queue<pair<int,int> >q;
	for(int i=x;i<=n;i++){
		if(vis[i])
			continue;
		if(tmp<a[i].v)
			break;
		tmp-=a[i].v;
		Max=max(a[i].v,Max);
		q.push({-a[i].id,i});
	}
	while(!q.empty()){
		int Tmp=-q.top().first,www=q.top().second;
		q.pop();
		pair<int,int> awa=query(calc1(Max+1),calc2(a[www].v+tmp),1,n,1);
		if(awa.first>Tmp){
			int ppp=*s[M[awa.second]].begin();
			tmp-=b[Tmp],vis[y[*s[M[awa.second]].begin()]]=1;
			s[M[awa.second]].erase(ppp);
			if(!s[M[awa.second]].empty())
				modify(1,n,M[awa.second],M[awa.second],*s[M[awa.second]].begin(),1);
			else
				modify(1,n,M[awa.second],M[awa.second],0,1);
		}
		else
			vis[www]=1;
	}
	ans++;
}
int main(){
//	freopen("3.in","r",stdin);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>a[i].v,a[i].id=i;
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
		y[a[i].id]=i;
	int cnt=0;
	for(int i=1;i<=n;i++){
		if(!M[a[i].v])
			M[a[i].v]=++cnt,w[cnt]=a[i].v;
		s[M[a[i].v]].insert(a[i].id);
		Y[M[a[i].v]]=a[i].v;
	}
	build(1,cnt,1);
	for(int i=1;i<=n;i++){
		if(vis[i])
			continue;
		work(i);
	}
	cout<<ans;
}
2025/1/9 12:12
加载中...