测试点1本地过了,CodeForces RE 了。在洛谷 ide 上测试发现是在最后一次 cin>>tim[i] 时re,找不到原因求调
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e15+5;
int n,d,q;
int tim[200005];
int f[200005][64],g[200005][64];
struct node{
int sx,sy,tx,ty,dx,dy;
int minx(){
return min(sx,tx);
}
int miny(){
return min(sy,ty);
}
int maxx(){
return max(sx,tx);
}
int maxy(){
return max(sy,ty);
}
void print(){
cout<<sx<<" "<<sy<<" "<<tx<<" "<<ty<<"\n";
}
}vec[200005];
namespace my_cmp{
bool maxxup(int x,int y){
if(vec[x].maxx()==vec[y].maxx()) return x>y;
else return vec[x].maxx()<vec[y].maxx();
}
bool minxdw(int x,int y){
if(vec[x].minx()==vec[y].minx()) return x>y;
else return vec[x].minx()>vec[y].minx();
}
bool maxyup(int x,int y){
if(vec[x].maxy()==vec[y].maxy()) return x>y;
else return vec[x].maxy()<vec[y].maxy();
}
bool minydw(int x,int y){
if(vec[x].miny()==vec[y].miny()) return x>y;
else return vec[x].miny()>vec[y].miny();
}
};
void pre_solve(int dx,int dy,bool (*cmp)(int,int)){
multimap<int,int>mp;
mp.clear();
vector<int>a;
a.reserve(n+q);
for(int i=1;i<=n+q;i++){
a.push_back(i);
}
sort(a.begin(),a.end(),cmp);
for(auto i:a){
if(i<=n){
int p1,p2;
if(dx!=0){
p1=vec[i].miny();
p2=vec[i].maxy();
}else{
p1=vec[i].minx();
p2=vec[i].maxx();
}
auto it1=mp.lower_bound(p1);
auto it2=mp.upper_bound(p2);
for(auto j=it1;j!=it2;j++){
f[j->second][0]=i;
g[j->second][0]=abs(vec[i].tx-vec[j->second].tx)+abs(vec[i].ty-vec[j->second].ty);
mp.erase(j);
}
}
if(vec[i].dx==dx&&vec[i].dy==dy){
if(dx!=0){
mp.insert(make_pair(vec[i].sy,i));
}else{
mp.insert(make_pair(vec[i].sx,i));
}
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>d;
for(int i=1;i<=n;i++){
cin>>vec[i].sx>>vec[i].sy>>vec[i].tx>>vec[i].ty;
if(vec[i].tx!=vec[i].sx){
vec[i].dx=(vec[i].tx-vec[i].sx)/abs(vec[i].tx-vec[i].sx);
}
if(vec[i].ty!=vec[i].sy){
vec[i].dy=(vec[i].ty-vec[i].sy)/abs(vec[i].ty-vec[i].sy);
}
}
cin>>q;
for(int i=n+1;i<=n+q;i++){
char dir;
cin>>vec[i].sx>>vec[i].sy>>dir>>tim[i];
vec[i].tx=vec[i].sx; vec[i].ty=vec[i].sy;
if(dir=='U') vec[i].dy=1;
else if(dir=='D') vec[i].dy=-1;
else if(dir=='L') vec[i].dx=-1;
else if(dir=='R') vec[i].dx=1;
}
pre_solve(0,-1,my_cmp::minydw);
pre_solve(0,1,my_cmp::maxyup);
pre_solve(1,0,my_cmp::maxxup);
pre_solve(-1,0,my_cmp::minxdw);
for(int i=1;i<64;i++){
for(int j=1;j<=n+q;j++){
f[j][i]=f[f[j][i-1]][i-1];
g[j][i]=min(inf,g[j][i-1]+g[f[j][i-1]][i-1]);
}
}
for(int i=n+1;i<=n+q;i++){
int p=i,dis=tim[i];
for(int j=63;j>=0;j--){
if(f[p][j]==0) continue;
if(dis>=g[p][j]){
dis-=g[p][j];
p=f[p][j];
}
}
int x=vec[p].tx,y=vec[p].ty;
int dx=vec[p].dx,dy=vec[p].dy;
if(dis==0){
cout<<x<<" "<<y<<"\n";
continue;
}
if(f[p][0]==0){
x+=dis*dx;
y+=dis*dy;
if(x<0) x=0;
if(x>d) x=d;
if(y<0) y=0;
if(y>d) y=d;
cout<<x<<" "<<y<<"\n";
continue;
}
int dist;
if(dx!=0){
dist=abs(x-vec[f[p][0]].sx);
}else{
dist=abs(y-vec[f[p][0]].sy);
}
if(dis>dist){
dis-=dist;
p=f[p][0];
x+=dist*dx;
y+=dist*dy;
dx=vec[p].dx;
dy=vec[p].dy;
}
x+=dis*dx;
y+=dis*dy;
cout<<x<<" "<<y<<"\n";
}
}
3 3
0 0 0 1
0 2 2 2
3 3 2 3
12
0 0 L 0
0 0 L 1
0 0 L 2
0 0 L 3
0 0 L 4
0 0 L 5
0 0 L 6
2 0 U 2
2 0 U 3
3 0 U 5
1 3 D 2
1 3 R 2