18pts求助
查看原帖
18pts求助
398152
MinimumSpanningTree最小生成树楼主2024/11/27 13:57

AC on #1#11#13,其他 WA。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=5e4+100,INF=0x3f3f3f3f;
int n,m,ans[N];
ll tag[N*4];
ll ma=-INF,mi=INF;
struct node
{
	int op,x,y,id;
	ll c;
}a[N],b1[N],b2[N];
struct node2
{
	int tl,tr;
	ll val;
}t[N*4];
void build(int p,int l,int r)
{
	int mid=(l+r)/2;
	tag[p]=0;
	t[p].tl=l,t[p].tr=r;
	if(l==r) return;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
}  
void add_tag(int p,ll num)
{
	tag[p]+=num;
	t[p].val+=num*(t[p].tr-t[p].tl+1);
} 
void push_down(int p)
{
	if(!tag[p]) return;
	add_tag(p*2,tag[p]); 
	add_tag(p*2+1,tag[p]);
	tag[p]=0;
} 
void update(int p,int l,int r,ll num)
{
	int mid=(t[p].tl+t[p].tr)/2;
	if(l<=t[p].tl&&r>=t[p].tr)
	{
		add_tag(p,num);
		return;
	} 
	push_down(p);
	if(l<=mid) update(p*2,l,r,num);
 	if(r>mid) update(p*2+1,l,r,num);
 	t[p].val=t[p*2].val+t[p*2+1].val;
} 
ll query(int p,int l,int r)
{
	int mid=(t[p].tl+t[p].tr)/2;
	ll sum=0;
	if(l<=t[p].tl&&r>=t[p].tr) return t[p].val;
	push_down(p);
	if(l<=mid) sum+=query(p*2,l,r);
	if(r>mid) sum+=query(p*2+1,l,r);
	return sum; 
} 
void whole_binary_find(int l,int r,int ql,int qr)
{
	//printf("%d %d %d %d\n",l,r,ql,qr);
	int mid=(l+r)>>1,k1=0,k2=0;
	ll cnt;
	if(ql>qr) return;
	if(l==r)
	{
		for(int i=ql;i<=qr;i++)
		{
			if(a[i].op==2) ans[a[i].id]=l;
		}
		return;
	}
	for(int i=ql;i<=qr;i++)
	{
		if(a[i].op==1)
		{
			if(a[i].c>mid)
			{
				b2[++k2]=a[i];
				update(1,a[i].x,a[i].y,1);
			}
			else b1[++k1]=a[i];
		}
		else
		{
			cnt=query(1,a[i].x,a[i].y);
			if(cnt>=a[i].c) b2[++k2]=a[i];
			else a[i].c-=cnt,b1[++k1]=a[i];
		}
	}
	for(int i=1;i<=k1;i++)
	{
		if(a[i].op==1) update(1,a[i].x,a[i].y,-1);
	}
	for(int i=ql,j=1;j<=k1;i++,j++) a[i]=b1[j];
	for(int i=ql+k1,j=1;j<=k2;i++,j++) a[i]=b2[j];
	whole_binary_find(l,mid,ql,ql+k1-1);
	whole_binary_find(mid+1,r,ql+k1,qr);
} 
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		a[i].id=i;
		scanf("%d%d%d%lld",&a[i].op,&a[i].x,&a[i].y,&a[i].c);
		if(a[i].op==1) ma=max(ma,a[i].c),mi=min(mi,a[i].c);
	}
	build(1,1,n);
	whole_binary_find(mi,ma,1,m);
	for(int i=1;i<=m;i++)
	{
		if(ans[i]) printf("%d\n",ans[i]);
	}
	return 0;
}
2024/11/27 13:57
加载中...