[最短路 && 主席树维护HASH] 51nod1863 Travel
来源:互联网 发布:龙虎榜数据真实吗 编辑:程序博客网 时间:2024/06/05 19:57
传送门
把一条路径上的点值按排名顺序排序,那么路径的优劣就是字典序。
相当于是求一条字典序最大的路径。 最长路
然后就是老套路,用主席树来维护hash,就可以在O(log)的时间里比较两个串的字典序,然后就套最短路就可以了
用对优化的DIJ复杂度就是
#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#include <ctime>using namespace std;typedef unsigned int ll;typedef pair<int,int> ii;const int N=100010;const ll base=100003;int n,m,cnt0,cnt,idx[N],G[N],rk[N],a[N],rt[N],ls[N*70],rs[N*70],vis[N];ll v[N*70],pw[N];struct edge{ int t,nx;}E[N*20];inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline void rea(int &x){ char c=nc(); x=0; for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());}inline void add(int x,int y){ E[++cnt0].t=y; E[cnt0].nx=G[x]; G[x]=cnt0; E[++cnt0].t=x; E[cnt0].nx=G[y]; G[y]=cnt0;}void Add(int &g,int l,int r,int x){ int k=g; g=++cnt; ls[g]=ls[k]; rs[g]=rs[k]; v[g]=v[k]; if(l==r){ v[g]++; return ; } int mid=l+r>>1; if(x<=mid) Add(ls[g],l,mid,x); else Add(rs[g],mid+1,r,x); v[g]=v[ls[g]]*pw[r-mid]+v[rs[g]];}inline bool cmp(int x,int y){ if(v[x]==v[y]) return false; int l=1,r=n,ret=x; while(l<r){ int mid=l+r>>1; if(v[ls[x]]!=v[ls[y]]) x=ls[x],y=ls[y],r=mid; else x=rs[x],y=rs[y],l=mid+1; } return v[x]<v[y];}struct stp{ int x,y; friend bool operator <(stp a,stp b){ return !cmp(a.y,b.y); }};priority_queue<stp> Q;void print(int x){ if(x>=10) print(x/10); putchar(x%10+'0');}void dfs(int g,int l,int r){ if(!g) return ; if(l==r){ for(int i=1;i<=v[g];i++) print(idx[l]),putchar(' '); return ; } int mid=l+r>>1; dfs(ls[g],l,mid); dfs(rs[g],mid+1,r);}int main(){ rea(n); rea(m); pw[0]=1; for(int i=1;i<=n;i++) pw[i]=pw[i-1]*base; for(int i=1;i<=n;i++){ rea(idx[i]); rk[idx[i]]=i; } for(int i=1;i<=n;i++) rea(a[i]),a[i]=rk[a[i]]; for(int i=1;i<=m;i++){ int x,y; rea(x); rea(y); add(x,y); } Q.push(stp{1,rt[1]}); vis[1]=1; while(!Q.empty()){ int x=Q.top().x,y=Q.top().y; Q.pop(); //while(y!=rt[x]) continue; int cur=rt[x],lst=cnt,cg=0; Add(cur,1,n,a[x]); for(int i=G[x];i;i=E[i].nx) if(!rt[E[i].t] || cmp(cur,rt[E[i].t])){ rt[E[i].t]=cur; cg=1; Q.push(stp{E[i].t,rt[E[i].t]}); //printf("%d\n",E[i].t); dfs(rt[E[i].t],1,n); putchar('\n'); } //(!cg) cnt=lst; } Add(rt[n],1,n,a[n]); dfs(rt[n],1,n); return 0;}
阅读全文
0 0
- [最短路 && 主席树维护HASH] 51nod1863 Travel
- [最短路 主席树 Hash] 51Nod 算法马拉松26 E Travel
- [最短路 && 主席树维护HASH]Codeforces 464E. The Classic Problem
- codeforces464E The Classic Problem -- 最短路+主席树+Hash
- [主席树维护HASH] Codechef. Cloning
- [最短路 主席树 Hash] Codeforces 464E #265 (Div. 1) E. The Classic Problem
- 【HDU】2433 Travel 最短路树优化
- HDU 2433 Travel 最短路树
- HDU - 2433 Travel (最短路树)
- HDU 2433 Travel 最短路树
- [HDU2433] Travel BFS+最短路生成树
- POJ 2433 Travel 最短路树?
- hdu 2433 Travel 最短路
- hdu 2433 Travel (bfs+最短路生成树+剪枝)
- [主席树维护HASH && SET维护DFS序] Codechef. Walks on the binary tree
- bzoj3207--Hash+主席树
- hdu 2433 Travel 最短路+预处理
- Hdu 2433 Travel 删边+最短路之和
- STM32串口第一个字节丢失问题的分析过程
- Akka(21): Stream:实时操控:人为中断-KillSwitch
- opencv 滤波
- 第四课 Tensorflow并发读取数据
- 人工智能技术基础
- [最短路 && 主席树维护HASH] 51nod1863 Travel
- 扩展kmp入门---hd Best Reward 3613
- Android填坑之旅(第十三篇)教你一招搞定项目混淆配置
- swift之类的继承、父类方法重写、属性值监听
- L0 Smoothing 笔记(二)
- 深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)
- 51 NOD 1279 扔盘子(单调栈)
- 基于51单片机的电子时钟
- Android studio 导入项目出现:Failed to crunch file