洛谷P2505||bzoj2750 [HAOI2012]道路 && zkw线段树
https://www.luogu.org/problemnew/show/P2505
https://www.lydsy.com/JudgeOnline/problem.php?id=2750
神奇的题目...
好像dijkstra序(dijkstra遍历点的顺序)就是“最短路dag”的一个拓扑序
错误记录:127行写成addto(d2[u],dn[v])
然而此题卡常,学了一下zkw线段树优化dijkstra
#pragma GCC optimize(3)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
struct pii
{
int fi,se;
pii():fi(),se(){}
pii(int a,int b):fi(a),se(b){}
};
bool operator<(const pii &a,const pii &b)
{
return a.fi<b.fi;
}
namespace SS
{
int M;pii d[];
void init(int n)
{
int i;
//zkw线段树是满二叉树,i的lc为i*2(i<<1),rc为i*2+1(i<<1|1)
for(M=;M<=n+;M<<=);
//M-1表示除叶节点外共有多少节点
//理论上写M<=n就够了,写M<=n+1是为了简化后面边界处理
for(i=M;i<=M+M-;++i) d[i]=pii(0x3f3f3f3f,i-M);
//d[M+0..M+n]存储"数组"a[0..n]即叶节点
//注意叶节点下标从0开始
for(i=M-;i;--i) d[i]=min(d[i<<],d[i<<|]);
}
void set(int p,int x)
{
d[M+p]=pii(x,p);
for(int i=(M+p)>>;i;i>>=)
d[i]=min(d[i<<],d[i<<|]);
}
inline pii qmin()
{
return d[];
}
}
struct E
{
int to,nxt,d;
};
const int md=1e9+;
void addto(int &x,int y)
{
x+=y;
if(x>=md) x-=md;
}
int mul(int x,int y){return ll(x)*y%md;}
int an[];
int n,m;
namespace G
{
E e[];
int f1[],ne;
void me(int x,int y,int z)
{
e[++ne].to=y;e[ne].nxt=f1[x];f1[x]=ne;e[ne].d=z;
}
int d[],dn[],d2[];
int tt[];
bool vis[];
void calc(int S)
{
int u,k,v,i;pii t;
memset(d+,0x3f,sizeof(d[])*n);
memset(dn+,,sizeof(dn[])*n);
memset(vis+,,sizeof(vis[])*n);
memset(d2+,,sizeof(d2[])*n);
tt[]=;
SS::init(n);
SS::set(S,);
d[S]=;dn[S]=;
while()
{
t=SS::qmin();
if(t.fi==0x3f3f3f3f) break;
//printf("at%d %d\n",t.fi,t.se);
u=t.se;SS::set(u,0x3f3f3f3f);
//if(vis[u]) continue;
tt[++tt[]]=u;
vis[u]=;
for(k=f1[u];k;k=e[k].nxt)
{
v=e[k].to;
if(d[v]>d[u]+e[k].d)
{
d[v]=d[u]+e[k].d;
dn[v]=dn[u];
SS::set(v,d[v]);
}
else if(d[v]==d[u]+e[k].d)
addto(dn[v],dn[u]);
}
}
for(i=tt[];i>=;--i)
{
u=tt[i];d2[u]=;
for(k=f1[u];k;k=e[k].nxt)
{
v=e[k].to;
if(d[v]==d[u]+e[k].d)
{
addto(d2[u],d2[v]);
}
}
}
for(i=;i<=tt[];++i)
{
u=tt[i];
for(k=f1[u];k;k=e[k].nxt)
{
v=e[k].to;
if(d[v]==d[u]+e[k].d)
addto(an[k],mul(dn[u],d2[v]));
}
}
}
};
int main()
{
int i,x,y,z;
scanf("%d%d",&n,&m);
for(i=;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&z);
G::me(x,y,z);
}
for(i=;i<=n;++i)
{
G::calc(i);
}
for(i=;i<=m;++i)
printf("%d\n",an[i]);
return ;
}
洛谷P2505||bzoj2750 [HAOI2012]道路 && zkw线段树的更多相关文章
- 洛谷P1438 无聊的数列 [zkw线段树]
题目传送门 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]} ...
- 洛谷P3434 [POI2006]KRA-The Disks(线段树)
洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...
- 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...
- 洛谷P3928 Sequence2(dp,线段树)
题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...
- 【题解】洛谷P4145 花神游历各国(线段树)
洛谷P4145:https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)=1 一个限制条件 与正常线段树不同的是区间修改为开方 那么 ...
- 洛谷P4588 [TJOI2018]数学计算 【线段树】
题目链接 洛谷P4588 题解 用线段树维护即可 #include<algorithm> #include<iostream> #include<cstring> ...
- 【洛谷3822】[NOI2017] 整数(线段树压位)
题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...
- 洛谷P4556 雨天的尾巴(线段树合并)
洛谷P4556 雨天的尾巴 题目链接 题解: 因为一个点可能存放多种物品,直接开二维数组进行统计时间.空间复杂度都不能承受.因为每一个点所拥有的物品只与其子树中的点有关,所以可以考虑对每一个点来建立一 ...
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
随机推荐
- ubuntu安装ros indigo
版本是14.04.1 一.先配置 1.点击新立得软件包管理器,输入密码exbot123, 2,点击最上面一栏的设置,选择软件源,前四个打勾,后一个不打,把sevice america改成mainsev ...
- CSS3学习笔记(2)—左右跳动的红心
还在为无法表达内心澎湃的心情而着急吗?还在为制作跳动的心而烦恼吗?哈哈,今天我就把代码全部奉上,为你们追妹子添点贡献,下面来看最终的动态效果(事先说明一下:我用的截屏gif制作软件是绿色版的,所以gi ...
- hadoop集群部署后,遇到的问题记录
1. 部署完,启动集群后,mapred-site.xml文件中配置没有生效 <property> <name>mapred.job.tracker</name> ...
- SQL:内连接、左外连接、右外连接、全连接、交叉连接区别
有两个表A和表B.表A结构如下: Aid:int:标识种子,主键,自增ID Aname:varchar 数据情况,即用select * from A出来的记录情况如下图1所示: 图1:A表数据表B结构 ...
- DGA域名——可以每天只生成一个域名,因此最多存在365个 DGA域名;
Mirai变种中的DGA 分享到: 发布时间:2016-12-12 16:02:57 作者:360网络安全研究院 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿 那个导致美国断网 ...
- cygwin Could not create directory '/home/Administrator/.ssh'
在cygwin下运行: ssh-keygen -C "634772208@qq.com" -t rsa 时,出现如下错误: cygwin Could not create dire ...
- BZOJ_2216_[Poi2011]Lightning Conductor_决策单调性
BZOJ_2216_[Poi2011]Lightning Conductor_决策单调性 Description 已知一个长度为n的序列a1,a2,...,an. 对于每个1<=i<=n, ...
- [FJOI 2016] 神秘数
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4408 [算法] 首先考虑一组询问怎样做 : 将数组按升序排序 , 假设我们现在可以表 ...
- bzoj1799同类分布——数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1799 数位DP. 1.循环方法 预处理出每个位数上,和为某个数,模某个数余某个数的所有情况: ...
- UESTC(LCA应用:求两点之间的距离)
Journey Time Limit: 15000/3000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Bob has ...