洛谷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,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
随机推荐
- React + fetch API + 百度地图api + 跨域 填坑
做项目遇到一个百度地图api 的跨域问题.由于使用fetch ,在调用类似 http://api.map.baidu.com/geocoder/v2/callback=renderReverse&am ...
- Linux ARM交叉编译工具链制作过程【转】
本文转载自:http://www.cnblogs.com/Charles-Zhang-Blog/archive/2013/02/21/2920999.html 一.下载源文件 源代码文件及其版本与下载 ...
- VK Cup 2012 Qualification Round 1 E. Phone Talks —— DP
题目链接:http://codeforces.com/contest/158/problem/E E. Phone Talks time limit per test 3 seconds memory ...
- 转回java,项目遇到的环境相关问题记录
fastjson解析报错,兼容java8的time包:需要升级fastjson版本到1.2.9 https://www.oschina.net/question/129411_142776 j ...
- node.js 开发博客系统
1. 安装yoman :npm install -g yo 2. 安装 generator-express :npm install -g generator-express 3. 安装 bower ...
- Android图片加载神器之Fresco-加载图片基础[详细图解Fresco的使用](秒杀imageloader)
Fresco简单的使用—SimpleDraweeView 百学须先立志—学前须知: 在我们平时加载图片(不管是下载还是加载本地图片…..)的时候,我们经常会遇到这样一个需求,那就是当图片正在加载时应该 ...
- LoadRunner添加检查点
见过磕长头的人吗?他们的脸和手都很脏,可是心灵却很干净. ——<可可西里> 1.选择需要设置检查点的内容 有如下“添加客户”功能,添加任务操作完成之后,我希望检查是否添加成功.从图中可以看 ...
- Android Studio 使用Gradle多渠道打包
第一步:配置AndroidManifest.xml 以友盟渠道为例,渠道信息一般都是写在 AndroidManifest.xml文件中,大约如下: <meta-data android:name ...
- php排序方法之快速排序
$arr = array(3,55,45,2,67,76,6.7,-65,85,4); function quickSort($arr){ if (count($arr) <= 1){ retu ...
- 多线程之:正确使用 Volatile 变量
转载:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile ...