就是二分找到点在符合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;
}