KD优化建图,72pts,有WA有T,求助
查看原帖
KD优化建图,72pts,有WA有T,求助
242931
zjqzjq楼主2023/1/23 19:10
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e5+10;
int n,m,w,h,ch[N][2];
struct node{
    int l,r,d,u,x,y,id;
}tr[N];
bool cmpx(node x,node y){
    return x.x<y.x || x.x==y.x && x.y<y.y;
}
bool cmpy(node x,node y){
    return x.y<y.y || x.y==y.y && x.x<y.x;
}
int head[N],tot=0;
struct edge{
    int to,nxt,val;
}mp[N*40];
void add(int x,int y,int z){
    mp[++tot]=edge{y,head[x],z};
    head[x]=tot;
}
void pushup(int x){
    tr[x].l=min({tr[ch[x][0]].l,tr[ch[x][1]].l,tr[x].x});
    tr[x].r=max({tr[ch[x][0]].r,tr[ch[x][1]].r,tr[x].x});
    tr[x].d=min({tr[ch[x][0]].d,tr[ch[x][1]].d,tr[x].y});
    tr[x].u=max({tr[ch[x][0]].u,tr[ch[x][1]].u,tr[x].y});
}
int build(int l,int r,int o){
    if(l>r) return 0;
    int x=(l+r)/2;
    nth_element(tr+l,tr+x,tr+r+1,o?cmpx:cmpy);
    ch[x][0]=build(l,x-1,o^1);
    ch[x][1]=build(x+1,r,o^1);
    if(ch[x][0]) add(x,ch[x][0],0);
    if(ch[x][1]) add(x,ch[x][1],0);
    pushup(x);
    return x;
}
void link(int x,int L,int R,int D,int U,int p,int t){
    if(x==0 || tr[x].l>R || tr[x].r<L || tr[x].d>U || tr[x].u<D) return;
    if(tr[x].l>=L && tr[x].r<=R && tr[x].d>=D && tr[x].u<=U){
        add(p,x,t);
        return;
    }
    if(tr[x].x>=L && tr[x].x<=R && tr[x].y>=D && tr[x].y<=U) add(p,x+n,t);
    link(ch[x][0],L,R,D,U,p,t);
    link(ch[x][1],L,R,D,U,p,t);
}
int vis[N],pos[N];
int d[N];
int main(){
    cin>>n>>m>>w>>h;
    for(int i=1;i<=n;i++){
        cin>>tr[i].x>>tr[i].y;
        tr[i].id=i;
        add(i,i+n,0);
    }
    tr[0]={inf,-inf,inf,-inf,0,0,0};
    int rt=build(1,n,0);
    for(int i=1;i<=n;i++) pos[tr[i].id]=i;
    while(m--){
        int p,t,L,R,D,U;
        cin>>p>>t>>L>>R>>D>>U;
        link(rt,L,R,D,U,pos[p]+n,t);
    }
    priority_queue<pair<ll,int> > q;
    int s=pos[1]+n;
    q.push(make_pair(0,s));
    memset(d,0x3f,sizeof(d));
    d[s]=0;
    while(q.size()){
        int x=q.top().second; q.pop();
        if(vis[x]) continue;
        vis[x]=1;
        for(int i=head[x];i;i=mp[i].nxt){
            int u=mp[i].to,v=mp[i].val;
            if(vis[u] || d[u]<=d[x]+v) continue;
            d[u]=d[x]+v;
            q.push(make_pair(-d[u],u));
        }
    }
    for(int i=2;i<=n;i++) cout<<d[pos[i]+n]<<"\n";
    return 0;
}

2023/1/23 19:10
加载中...