莫名re求调
查看原帖
莫名re求调
1163890
sjzsd147楼主2024/11/6 18:25

测试点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
2024/11/6 18:25
加载中...