Description

给定一张 \(n\) 个点,\(m\) 条边的无向图,求 \(S\) 到 \(T\) 的最短路,其中边权都是 \(2^k\) 的形式
\(n,m,k<=10^5\)
题面

Solution

与 \(NOI\) 整数类似
不过此题没有减法,那么复杂度可以均摊
我们按普通 \(dijkstra\) 那样跑,把 \(dis\) 数组改成一棵线段树
由于每一次只会加上一个数,用主席树维护一下就行了
对于进位,因为没有减法,所以产生 \(k\) 个 \(1\),至少需要 \(k\) 次操作,暴力改一次就是 \(O(1)\) 的了
那么暴力改复杂度就是对的了,代码十分简单
比较大小的方式就更二分哈希一样:二分到不同的位置,再判断这个位置
这题本身给了一个 \(hash\) ,\(seed=2,mod=10^9+7\) ,也可以过,但最好还是手写的好

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,mod=1e9+7;
int n,m,head[N],nxt[N*2],to[N*2],dis[N*2],num=0;
int S,T,lim,b[N*2],tt=0,rt[N],pre[N];
inline void link(int x,int y,int z){nxt[++num]=head[x];to[num]=y;head[x]=num;dis[num]=z;
}
struct Seg{int ls,rs,w;
}tr[N*120];
inline bool comp(int x,int y,int l,int r){if(l==r)return tr[x].w>tr[y].w;int mid=(l+r)>>1;if(tr[tr[x].rs].w==tr[tr[y].rs].w)return comp(tr[x].ls,tr[y].ls,l,mid);return comp(tr[x].rs,tr[y].rs,mid+1,r);
}
inline bool add(int x,int &y,int l,int r,int sa){y=++tt;tr[y]=tr[x];if(l==r){tr[y].w=tr[x].w^1;return tr[x].w;}int mid=(l+r)>>1,ret;if(sa>mid)ret=add(tr[x].rs,tr[y].rs,mid+1,r,sa);else{ret=add(tr[x].ls,tr[y].ls,l,mid,sa);if(ret)ret=add(tr[x].rs,tr[y].rs,mid+1,r,mid+1);}tr[y].w=(1ll*tr[tr[y].rs].w*b[mid-l+1]+tr[tr[y].ls].w)%mod;return ret;
}
struct data{int x,rt;bool operator <(const data &p)const{return comp(rt,p.rt,0,lim);}
};
priority_queue<data>Q;
inline void dfs(int x,int dep){if(x==S){printf("%d\n%d ",dep,x);return ;}dfs(pre[x],dep+1);printf("%d ",x);
}
inline void Output(int x){printf("%d\n",tr[rt[x]].w);dfs(x,1);exit(0);
}
int main(){freopen("pp.in","r",stdin);freopen("pp.out","w",stdout);cin>>n>>m;int x,y,z;for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);link(x,y,z);link(y,x,z);lim=max(lim,z);}lim+=100;b[0]=1;for(int i=1;i<=lim;i++)b[i]=1ll*b[i-1]*2%mod;cin>>S>>T;Q.push((data){S,rt[S]});while(!Q.empty()){data t=Q.top();Q.pop();if(t.rt!=rt[t.x])continue;if(t.x==T)Output(T);for(int i=head[t.x];i;i=nxt[i]){int u=to[i],RT;add(t.rt,RT,0,lim,dis[i]);if(!rt[u] || comp(rt[u],RT,0,lim))rt[u]=RT,Q.push((data){u,rt[u]}),pre[u]=t.x;}}puts("-1");return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/8715902.html

Codeforces 464E. The Classic Problem相关推荐

  1. CodeForces 464E The Classic Problem | 呆克斯歘 主席树维护高精度

    题意描述 有一个\(n\)点\(m\)边的无向图,第\(i\)条边的边权是\(2^{a_i}\).求点\(s\)到点\(t\)的最短路长度(对\(10^9 + 7\)取模). 题解 思路很简单--用主 ...

  2. CF464E The Classic Problem(主席树+哈希+最短路)

    CF464E The Classic Problem problem solution code problem 题目链接 solution 经典题. 本题很特别的是每条边的边权都是 222 的幂,而 ...

  3. Codeforces 776D The Door Problem

    题目链接:http://codeforces.com/contest/776/problem/D 把每一个钥匙拆成两个点${x,x+m}$,分别表示选不选这把钥匙. 我们知道一扇门一定对应了两把钥匙. ...

  4. codeforces C. Sonya and Problem Wihtout a Legend(dp or 思维)

    题目链接:http://codeforces.com/contest/713/problem/C 题解:这题也算是挺经典的题目了,这里附上3种解法优化程度层层递进,还有这里a[i]-i<=a[i ...

  5. CF464E-The Classic Problem【最短路,主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/CF464E 题目大意 nnn个点mmm条边的一张无向图,第iii条边长度为2xi2^{x_i}2xi​,求sss到t ...

  6. 【CodeForces - 706C】Hard problem(dp,字典序)

    题干: Vasiliy is fond of solving different tasks. Today he found one he wasn't able to solve himself, ...

  7. Codeforces 1000D Yet Another Problem On a Subsequence 动态规划

    D. Yet Another Problem On a Subsequence time limit per test 2 seconds memory limit per test 256 mega ...

  8. 【CF464E】The Classic Problem(主席树+最短路)

    点此看题面 大致题意: 给你一张无向图,每条边的边权为\(2^{x_i}\),求\(s\)到\(t\)的最短路. 最短路 最短路,首先考虑\(Dijkstra\).这里用\(SPFA\)似乎不太好,因 ...

  9. CodeForces - 1000D Yet Another Problem On a Subsequence(动态规划+组合数学)

    题目链接:点击查看 题目大意:给出n个数字组成的序列,现在规定"好数组"指的是一个连续序列a1,a2,...ak的a1=k-1,再规定"好序列"是可以分为若干个 ...

  10. 【CodeForces - 1096D】Easy Problem(dp,思维)

    题目大意: 现在有一个由小写字母组成的字符串,去掉这个字符串的第i个位置的字符会有ai的代价.你的任务是去掉这个字符串中的一些字符使得该字符串中不包含子序列hard,且去掉字符的代价之和尽可能小. 输 ...

最新文章

  1. MySQL查询进阶之多表查询
  2. [SDK文档]SDK简介
  3. 隐藏UITableView当没有数据或数据不够的时候出现的分割线.
  4. REVERSE-PRACTICE-BUUCTF-24
  5. android 命令使用详解,Android下pm 命令详解
  6. springboot热部署失效解决
  7. 去掉Win7资源管理器左侧不需要的项目
  8. netty : websocketx.WebSocketHandshakeException: not a WebSocket handshake request: missing upgrade
  9. 使用supervisor提高nodejs调试效率
  10. 大数据之-Hadoop之HDFS_基于JAVA的开发_客户端环境测试---大数据之hadoop工作笔记0055
  11. 查看已有设置_腾讯企点呼叫中心如何查看企点电话产生的数据报表?
  12. CCF NOI1018 打电话
  13. Lytain:PCWin10纯净专业版重装与程序员的高效部署
  14. 数学建模——数据分析方法
  15. 《工业设计史》 绪论
  16. java启动报错Port already in use: 1099
  17. JNPF快速开发平台-业务流程系统(BPM)开发方案
  18. matlab实现牛顿下山法(下山过程)
  19. Android项目实战_手机安全卫士软件管家
  20. Task 07--面向对象的编程

热门文章

  1. 一家胡三家的人工智能来了
  2. 开发基于GUI的R包(1)
  3. 对有序特征进行离散化(继承Spark的机器学习Estimator类)
  4. Oracle作业5——多表查询、子查询
  5. 统计学习方法——第四章朴素贝叶斯及c++实现
  6. Linux的history命令
  7. 【LeetCode-面试算法经典-Java实现】【136-Single Number(仅仅出现一次的数字)】
  8. Linux上利用NFS实现远程挂载
  9. jquery+thinkphp实现跨域抓取数据的方法
  10. Laravel中的日志与上传