D题求调或思路hack
  • 板块灌水区
  • 楼主yangzimu0131
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/21 21:43
  • 上次更新2024/12/22 09:52:40
查看原帖
D题求调或思路hack
1364148
yangzimu0131楼主2024/12/21 21:43

就是二分找到点在符合x/y坐标哪个区间内,然后再二分符合x/y坐标在哪个区间内,没有T

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int x,y,id;
}a[200010],b[200010];
bool cmp(node x,node y)
{
	if(x.x!=y.x)
		return x.x<y.x;
	return x.y<y.y;
}
bool cmpa(node x,node y)
{
	if(x.y!=y.y)
		return x.y<y.y;
	return x.x<y.x;
}
int xa[200010],xb[200010],ya[200010],yb[200010];
bool f[200010];
signed main()
{
	int n,m,x,y,k,ans=0;
	char opt;
	cin>>n>>m>>x>>y;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y;
		a[i].id=i;
		b[i]=a[i];
	}
	sort(a+1,a+n+1,cmp);
	sort(b+1,b+n+1,cmpa);
	for(int i=1;i<=n;i++)
	{
		xa[i]=a[i].x;
		xb[i]=b[i].x;
		ya[i]=a[i].y;
		yb[i]=b[i].y;
	//	cout<<xa[i]<<" "<<ya[i]<<" "<<xb[i]<<" "<<yb[i]<<endl;
	}
	for(int i=1;i<=m;i++)
	{
		cin>>opt>>k;
		if(opt=='L')//ya
		{
			int l=lower_bound(ya+1,ya+n+1,y)-ya;
			if(ya[l]>y)
			{
				x-=k;
				continue;
			}
			int r=upper_bound(ya+1,ya+n+1,y)-ya-1;
			int la=upper_bound(xa+l+1,xa+r+1,x-k)-xa,ra=upper_bound(xa+l+1,xa+r+1,x)-xa-1;
			//cout<<l<<" "<<r<<" "<<la<<" "<<ra<<" "<<x-k<<" "<<x<<" "<<endl;//2 2 3
			cout<<xa[la]<<" "<<xa[la-1]<<endl;
			for(int i=la;i<=ra;i++)
			{
				if(!f[a[i].id])
					ans++;
				f[a[i].id]=1;
			}
			x-=k;
		}else if(opt=='R')//ya
		{
			int l=lower_bound(ya+1,ya+n+1,y)-ya;
			if(ya[l]>y)
			{
				x+=k;
				continue;
			}
			int r=upper_bound(ya+1,ya+n+1,y)-ya-1;
			int la=upper_bound(xa+l+1,xa+r+1,x)-xa,ra=upper_bound(xa+l+1,xa+r+1,x+k)-xa-1;
			for(int i=la;i<=ra;i++)
			{
				if(!f[a[i].id])
					ans++;
				f[a[i].id]=1;
			}
				x+=k;
		}else if(opt=='U')//ya
		{
			int l=lower_bound(xb+1,xb+n+1,x)-xb;
			if(xb[l]>x)
			{
				y+=k;
				continue;
			}
			int r=upper_bound(xb+1,xb+n+1,x)-xb-1;
			int la=upper_bound(yb+l+1,yb+r+1,y-k)-yb,ra=upper_bound(yb+l+1,yb+r+1,y)-yb-1;
			for(int i=la;i<=ra;i++)
			{
				if(!f[b[i].id])
					ans++;
				f[b[i].id]=1;
			}
				y+=k;
		}else if(opt=='D')//ya
		{
			int l=lower_bound(xb+1,xb+n+1,x)-xb;
			if(xb[l]>x)
			{
				y-=k;
				continue;
			}
			int r=upper_bound(xb+1,xb+n+1,x)-xb-1;
			int la=upper_bound(yb+l+1,yb+r+1,y)-yb,ra=upper_bound(yb+l+1,yb+r+1,y+k)-yb-1;
			for(int i=la;i<=ra;i++)
			{
				if(!f[b[i].id])
					ans++;
				f[b[i].id]=1;
			}
				y-=k;
		}
		//cout<<x<<" "<<y<<" "<<ans<<endl;
	}
	//for(int i=1;i<=n;i++)
	//	cout<<f[i]<<" ";
	//1 3 0 0

	cout<<x<<" "<<y<<" "<<ans<<endl;
	return 0;
}
2024/12/21 21:43
加载中...