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线段树的更多相关文章

  1. 洛谷P1438 无聊的数列 [zkw线段树]

    题目传送门 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]} ...

  2. 洛谷P3434 [POI2006]KRA-The Disks(线段树)

    洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...

  3. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)

    LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...

  4. 洛谷P3928 Sequence2(dp,线段树)

    题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...

  5. 【题解】洛谷P4145 花神游历各国(线段树)

    洛谷P4145:https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)=1 一个限制条件 与正常线段树不同的是区间修改为开方 那么 ...

  6. 洛谷P4588 [TJOI2018]数学计算 【线段树】

    题目链接 洛谷P4588 题解 用线段树维护即可 #include<algorithm> #include<iostream> #include<cstring> ...

  7. 【洛谷3822】[NOI2017] 整数(线段树压位)

    题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...

  8. 洛谷P4556 雨天的尾巴(线段树合并)

    洛谷P4556 雨天的尾巴 题目链接 题解: 因为一个点可能存放多种物品,直接开二维数组进行统计时间.空间复杂度都不能承受.因为每一个点所拥有的物品只与其子树中的点有关,所以可以考虑对每一个点来建立一 ...

  9. 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化

    洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...

随机推荐

  1. HDU2068 RPG的错排 —— 错排

    题目链接:https://vjudge.net/problem/HDU-2068 RPG的错排 Time Limit: 1000/1000 MS (Java/Others)    Memory Lim ...

  2. 近期测试BUG总结

    前些日子上线了新版的app,在上线后发现了几个重大的bug,在此总结,在以后的测试工作中需要额外的关注. 需求流程bug 页面刷新bug 标签栏刷新bug 第一个bug出现的原因是产品需求与运营实际操 ...

  3. Loadrunner脚本自动关联和手动关联

    关于Loadrunner关联一.什么时候需要关联 1.关联的含义        关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服 ...

  4. Piggy-Bank(复习完全背包)

    传送门 题目大意: 有一个存钱的储存罐,给你它存满钱之前和之后的重量,和几类硬币的面值和重量. 求装满储钱罐时最小能得到多少钱. 题解:完全背包变形. 因为要求最小 一开始赋值大数. code: #i ...

  5. JAVA 内部类 (二)

    一.为什么要使用内部类 为什么要使用内部类?在<Think in java>中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继 ...

  6. HDU1171(01背包均分问题)

    Big Event in HDU Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

  7. 23.java方法的深入

    深入: public class MethodTest05{ public static void main(String[] args){ int i=m1(ture); System.out.pr ...

  8. leetcode398 and leetcode 382 蓄水池抽样算法

    382. 链表随机节点 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值.保证每个节点被选的概率一样. 进阶:如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现? 示 ...

  9. POI生成Excel工具类

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayInp ...

  10. 【Data structure & Algorithm】把二元查找树转变成排序的双向链表

    把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表,要求不能创建任何新节点,只调整指针指向. 比如将二元查找树 10 /       \ 6       ...