18pts wa+MLE 求调
查看原帖
18pts wa+MLE 求调
1088663
zzzyyyyhhhhh楼主2024/9/22 20:43

虽然马蜂不好,但悬赏 @ReTF 下的蛋一个。

#include<bits/stdc++.h>
using namespace std;
const int N = 5e4+100;
#define int long long
int n;
struct seg
{
	#define mid ((l+r)>>1)
	int cnt;
	seg *l1=0,*r1=0;
	seg(){cnt=0,l1=nullptr,r1=nullptr;}
	seg(int x,int y){cnt=0,l1=nullptr,r1=nullptr;}
	#define ll (l1!=nullptr?l1:l1=new seg(l,mid))
	#define rr (r1!=nullptr?r1:r1=new seg(mid+1,r))
	void insert(int l,int r,int &val,int num)
	{
		// if(r==0)assert(0);
		// if(l==r)return;
		// cout<<l<<' '<<r<<' '<<val<<' '<<num<<'\n';
		if(l==r)
		{
			cnt+=num;
			// cout<<ll<<'\n';
			return;
		}
		// cout<<l<<' '<<r<<' '<<val<<' '<<num<<'\n';
		cnt+=num;
		if(val<=mid)
		{
			// ll;
			// if(l1==nullptr)assert(0);
			return ll->insert(l,mid,val,num);
		}
		else
		{
			// rr;
			// if(rr==nullptr)assert(0);
			return rr->insert(mid+1,r,val,num);
		}
	}
	int find(int l,int r,int &val)
	{
		if(l==r)return cnt;
		if(val>mid)if(ll)return ll->cnt+rr->find(mid+1,r,val);else if(rr)return rr->find(mid+1,r,val);else return 0;
		if(ll)return ll->find(l,mid,val);
		return 0;
	}
	#undef ll
	#undef rr
};
struct t
{
	signed l1,r1;
	seg x,y;
}tr[N*4];
namespace sg
{
	#define ll (tr[x].l1?tr[x].l1:tr[x].l1=++cnt,tr[tr[x].l1].x=seg(1,2*n+100),tr[tr[x].l1].y=seg(1,2*n+100),tr[x].l1)
	#define rr (tr[x].r1?tr[x].r1:tr[x].r1=++cnt,tr[tr[x].r1].x=seg(1,2*n+100),tr[tr[x].r1].y=seg(1,2*n+100),tr[x].r1)
	#define xx (tr[x])
	int cnt=1;
	// void build(int l,int r,int x)
	// {
	// 	// cout<<"A"<<x<<'\n';
	// 	xx.x=seg(1,2*n+100);
	// 	xx.y=seg(1,2*n+100);
	// 	// cout<<xx.x.l<<' '<<xx.x.r<<'\n';
	// 	if(l==r)return;
	// 	ll=++cnt;
	// 	rr=++cnt;
	// 	build(l,mid,ll);
	// 	build(mid+1,r,rr);
	// 	// cout<<"C"<<tr[x].l1<<' '<<tr[x].r1<<'\n';
	// }
	void mod(int l1,int r1,int l,int r,int x,int val)
	{
		// cout<<"ST";
		// cout<<"B"<<x<<'\n';
		xx.y.insert(1,2*n+100,val,min(r1,r)-max(l,l1)+1);
		if(l>=l1&&r<=r1)
		{
			// cout<<x<<' '<<val<<'\n';
			xx.x.insert(1,2*n+100,val,1);
			return;
		}
		// cout<<"A"<<x<<' '<<val<<'\n';
		if(l==r)return;
		if(l1<=mid)
		{
			mod(l1,r1,l,mid,ll,val);
		}
		if(r1>mid)
		{
			mod(l1,r1,mid+1,r,rr,val);
		}
	}
	int rk(int l1,int r1,int l,int r,int x,int val)
	{
		if(l>=l1&&r<=r1)
		{
			return xx.y.find(1,2*n+100,val);
		}
		int res=xx.x.find(1,2*n+100,val)*(r1-l1+1);
		if(l1<=mid)
		{
			res+=rk(l1,r1,l,mid,ll,val);
		}
		if(r1>mid)
		{
			res+=rk(l1,r1,mid+1,r,rr,val);
		}
		return res;
	}
	#undef mid
	int find1(int l1,int r1,int k)
	{
		int l=1,r=2*n+15,mid,ans=0;
		while(l<=r)
		{
			mid=(l+r)>>1;
			// cout<<"A"<<-mid+2*n+10<<' '<<rk(l1,r1,1,n,1,mid)<<'\n';
			if(rk(l1,r1,1,n,1,mid)>=k)
			{
				ans=mid;
				r=mid-1;
			}
			else
			{
				l=mid+1;
			}
		}
		return -ans+n+10;
	}
	void insert(int l,int r,int val)
	{
		mod(l,r,1,n,1,-val+n+10);
	}
}
using sg::find1;
using sg::insert;
int m;
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	// freopen("D:\\Backup\\Downloads\\P3332_4.in","r",stdin);
	cin>>n>>m;
	tr[1].x=seg(1,2*n+100);
	tr[1].y=seg(1,2*n+100);
	int op,l,r,c;
	for(int i=1;i<=m;i++)
	{
		cin>>op>>l>>r>>c;
		if(op&1)
		{
			insert(l,r,c);
		}
		else
		{
			cout<<find1(l,r,c)<<'\n';
		}
	}
}
2024/9/22 20:43
加载中...