求助卡常
查看原帖
求助卡常
638537
g1ove楼主2023/8/19 15:09

rt 教练的 OJ 不能吸氧 这份程序跑了 8s 怎么卡

#include<bits/stdc++.h>
#define reg register
#define N 300005
#define M 1000005
using namespace std;
int n,m,ans[N*2],maxy;
struct oper{
	int opr,x,y,id;
}q[N*2],b[N*2];
inline bool cmp(oper a,oper b)
{
	return a.x<b.x; 
}
struct BIT{
	int tr[M];
	inline void add(int x,int v)
	{
		while(x<=maxy)
		{
			tr[x]=max(tr[x],v);
			x+=x&-x;
		}
		return;
	} 
	inline int ask(int x)
	{
		int maxx=-1e9;
		while(x)
		{
			maxx=max(maxx,tr[x]);
			x-=x&-x;
		}
		return maxx;
	}
	inline void clear(int x)
	{
		while(x<=maxy)
		{
			tr[x]=-1e9;
			x+=x&-x; 
		}
	}
}tr;
int stk[4*N],top;
inline void solve(int l,int r)
{
	if(l==r) return;
	int mid=(l+r)/2;
	solve(l,mid);
	solve(mid+1,r);
	for(reg int i=l;i<=r;i++) b[i]=q[i];
	sort(q+l,q+1+mid,cmp);
	sort(q+mid+1,q+1+r,cmp);
	int i=l,j=mid+1;
	for(j=mid+1;j<=r;j++)
	{
		while(i<=mid&&q[i].x<=q[j].x)
		{
			if(q[i].opr==2)
			{
				++i;
				continue;
			}
			tr.add(q[i].y,q[i].x+q[i].y);
			stk[++top]=q[i].y;
			++i;
		}
		if(q[j].opr==2)
			ans[q[j].id]=min(ans[q[j].id],q[j].x+q[j].y-tr.ask(q[j].y));
	}
	while(top) tr.clear(stk[top--]);
	for(reg int i=l;i<=r;i++) q[i]=b[i];
}
int main()
{
	scanf("%d%d",&n,&m);
	for(reg int i=1;i<=n;i++)
	{
		q[i].id=i;
		q[i].opr=1;
		scanf("%d%d",&q[i].x,&q[i].y);
		q[i].x++,q[i].y++;
		maxy=max(maxy,q[i].y);
	}
	for(reg int i=n+1;i<=n+m;i++)
		scanf("%d%d%d",&q[i].opr,&q[i].x,&q[i].y),q[i].id=i,ans[i]=2e9,q[i].x++,q[i].y++,maxy=max(maxy,q[i].y);
	maxy++;
	fill(tr.tr,tr.tr+1+M-3,-1e9);
	solve(1,n+m);
	for(reg int i=1;i<=n+m;i++)
		q[i].x=M-q[i].x;
	solve(1,n+m);
	for(reg int i=1;i<=n+m;i++)
		q[i].y=maxy-q[i].y;
	solve(1,n+m);
	for(reg int i=1;i<=n+m;i++)
		q[i].x=M-q[i].x;
	solve(1,n+m);
	for(reg int i=n+1;i<=m+n;i++)
		if(q[i].opr==2) printf("%d\n",ans[i]);
	return 0;
}
2023/8/19 15:09
加载中...