當(dāng)前位置:
首頁(yè) >
Jzoj5234 外星人的路径
發(fā)布時(shí)間:2025/5/22
32
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Jzoj5234 外星人的路径
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有一個(gè)外星人控制了你的大腦。一開始你處于原點(diǎn)(0,0)。外星人有一個(gè)由(R,U,D,L)組成的長(zhǎng)度為M 的操作序列,分別代表(右,上,下,左)。
平面上有N 個(gè)關(guān)鍵點(diǎn),每當(dāng)外星人給出一個(gè)操作,你需要在這個(gè)方向上找到最近的一個(gè)關(guān)鍵點(diǎn),并走到那個(gè)點(diǎn)上。保證輸入數(shù)據(jù)合法。
100%的數(shù)據(jù),N,M≤100000,xi,yi≤200000。
這樣,我們搞2個(gè)權(quán)值線段樹,一個(gè)存橫坐標(biāo)一個(gè)存縱坐標(biāo),每次查詢當(dāng)前坐標(biāo)的前繼或者后續(xù)即可
復(fù)雜度O(mlgn)
#include<stdio.h> #include<string.h> #include<algorithm> #define M 200010 #define ls s[x].l #define rs s[x].r using namespace std; struct nod{ int l,r,s; }; struct Tree{nod s[3000000];int rt[M<<1],c;Tree(){ c=0; s[0]=(nod){0,0,0};memset(rt,0,sizeof rt);}inline int newnode(){ return ++c; }void ps(int x){ s[x].s=s[ls].s+s[rs].s; }void insert(int l,int r,int& x,int p){if(!x) x=newnode();if(l==r){ s[x].s=1; return; }int m=l+r>>1;if(p<=m) insert(l,m,ls,p);else insert(m+1,r,rs,p);ps(x);}int getmax(int l,int r,int x){for(int m;l<r;){m=l+r>>1;if(s[rs].s) { l=m+1; x=rs; }else { r=m; x=ls; }}return l;}int getmin(int l,int r,int x){for(int m;l<r;){m=l+r>>1;if(s[ls].s) { r=m; x=ls; }else { l=m+1; x=rs; }}return l;}int getpre(int l,int r,int x,int p){if(l==r) return p;int m=l+r>>1,v;if(p<=m) return getpre(l,m,ls,p);else v=getpre(m+1,r,rs,p);if(v!=p||!s[ls].s) return v;else return getmax(l,m,ls);}int getsuc(int l,int r,int x,int p){if(l==r) return p;int m=l+r>>1,v;if(p>m) return getsuc(m+1,r,rs,p);else v=getsuc(l,m,ls,p);if(v!=p||!s[rs].s) return v;else return getmin(m+1,r,rs);}void insert(int x,int y){ insert(1,M<<1,rt[x],y); }int pre(int x,int y){ return getpre(1,M<<1,rt[x],y); }int suc(int x,int y){ return getsuc(1,M<<1,rt[x],y); } } rot,lin; int n,m,x,y; char s[100010]; int main(){freopen("tratincice.in","r",stdin);freopen("tratincice.out","w",stdout);scanf("%d%d",&n,&m);rot.insert(M,M);lin.insert(M,M);for(int i=0;i<n;++i){scanf("%d%d",&x,&y);x+=M; y+=M;rot.insert(x,y);lin.insert(y,x);}x=y=M; scanf("%s",s);for(int i=0;i<m;++i){if(s[i]=='U') y=rot.suc(x,y);if(s[i]=='D') y=rot.pre(x,y);if(s[i]=='L') x=lin.pre(y,x);if(s[i]=='R') x=lin.suc(y,x);}printf("%d %d\n",x-M,y-M); }
轉(zhuǎn)載于:https://www.cnblogs.com/Extended-Ash/p/7846020.html
總結(jié)
以上是生活随笔為你收集整理的Jzoj5234 外星人的路径的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简单的链式语法及实际运用(链式编程的基本
- 下一篇: 大文件分片上传,断点续传,秒传 实现