Jzoj5234 外星人的路径
生活随笔
收集整理的這篇文章主要介紹了
Jzoj5234 外星人的路径
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
有一個外星人控制了你的大腦。一開始你處于原點(diǎn)(0,0)。外星人有一個由(R,U,D,L)組成的長度為M 的操作序列,分別代表(右,上,下,左)。
平面上有N 個關(guān)鍵點(diǎn),每當(dāng)外星人給出一個操作,你需要在這個方向上找到最近的一個關(guān)鍵點(diǎn),并走到那個點(diǎn)上。保證輸入數(shù)據(jù)合法。
100%的數(shù)據(jù),N,M≤100000,xi,yi≤200000。
這樣,我們搞2個權(quán)值線段樹,一個存橫坐標(biāo)一個存縱坐標(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 外星人的路径的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单的链式语法及实际运用(链式编程的基本
- 下一篇: 大文件分片上传,断点续传,秒传 实现