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;
}