WA #5 球跳
查看原帖
WA #5 球跳
752953
sLMxf楼主2024/10/14 08:31
#include<bits/stdc++.h>
#define int long long
#define file(name) freopen(name".in","r",stdin);//freopen(name".out","w",stdout);
using namespace std;
int n;
const int maxn=200006;
struct Segment{
	long long a[maxn],w[4*maxn],lzy[4*maxn];
	void pushup(int u)
	{
		w[u]=w[u*2]+w[u*2+1];
		lzy[u]=-1;
	}
	void build(int u=1,int l=1,int r=n)
	{
		if(l==r)
		{
			w[u]=a[l];
			return;
		}
		int m=(l+r)/2;
		build(u*2,l,m),build(u*2+1,m+1,r);
		pushup(u);
	}
	bool InRange(int L,int R,int l,int r)
	{
		return (l<=L)&&(R<=r);
	}
	bool OutofRange(int L,int R,int l,int r)
	{
		return (L>r)||(R<l);
	}
	void maketag(int u,int len,long long x)
	{
		lzy[u]=x;
		w[u]=len*x;
	}
	void pushdown(int u,int l,int r)
	{
		int m=(l+r)/2;
		if(lzy[u]!=-1)
		{
			maketag(u*2,m-l+1,lzy[u]);
			maketag(u*2+1,r-m,lzy[u]);
		}
		lzy[u]=-1;
	}
	int query(int l,int r,int u=1,int L=1,int R=n)
	{
		if(InRange(L,R,l,r)) return w[u];
		else if(!OutofRange(L,R,l,r))
		{
			int m=(L+R)/2;
			pushdown(u,L,R);
			return query(l,r,u*2,L,m)+query(l,r,u*2+1,m+1,R);
		}
		else return 0;
	}
	void update(int l,int r,long long x,int u=1,int L=1,int R=n)
	{
		if(InRange(L,R,l,r)) maketag(u,R-L+1,x);
		else if(!OutofRange(L,R,l,r))
		{
			int m=(L+R)/2;
			pushdown(u,L,R);
			update(l,r,x,u*2,L,m);
			update(l,r,x,u*2+1,m+1,R);
			pushup(u);
		}
	}
}a;
struct Pair{
	int first,second;
};
int find1(int L,int R,int y)
{
	int l=L,r=R;
	while(l<r)
	{
		int mid=(l+r-1)/2;
		if(a.query(mid,mid)>y) l=mid+1;
		else r=mid;
	}
	return l;
}
int find2(int L,int y)
{
	int l=L-1,r=n;
	while(l<r)
	{
//		cout<<l<<' '<<r<<endl;
		int mid=(l+r+1)/2;
		if(a.query(L,mid)>y) r=mid-1;
		else l=mid;
	}
	return l;
}
int query(int l,int y)
{
	int ln=a.query(l,n);
	if(ln<=y) return /*cout<<"["<<l<<','<<n<<"]\n",*/n-l+1;
	if(l==n) return 0;
	int L=find2(l,y);
	y-=a.query(l,L);
//	cout<<"["<<l<<','<<L<<"]\n";
//	if(y<a.query(n,n)) return L-l+1;
	int ans=query(find1(L+1,n,y),y);
	return ans+(L-l+1);
}
signed main()
{
//	file("CF1439Cbig");
	int m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a.a[i];
	a.build();
	while(m--)
	{
		int op,x,y;
		cin>>op>>x>>y;
		if(op==1)
		{
			int w=find1(1,x,y);
			a.update(w,x,y);
		}
		else
		{
			cout<<query(x,y)<<endl;
		}
//		for(int i=1;i<=n;i++) cout<<a.query(i,i)<<' ';
//		cout<<'\n';
	}
	return 0;
}
2024/10/14 08:31
加载中...