[AMPPZ2014]Petrol
关键点的最小生成树?
关键点初始化为0,跑多源最短路,然后重构整个图,用Kruskal跑最小生成树
然后跑树链剖分在线回答询问
对树上每个点维护到链顶的最大值,结合线段树可以做到\(\Theta(n \log n)\)的复杂度
#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std;
const int MAXN=1<<18;
int n,m,s,np,root;
int x[MAXN],y[MAXN],z[MAXN],h[MAXN],c[MAXN],f[MAXN];
int blg[MAXN],hp[MAXN],id[MAXN],ln[MAXN],fa[MAXN],sn[MAXN];
int dep[MAXN],ren[MAXN],siz[MAXN],top[MAXN],val[MAXN],lis[MAXN];
int tree[MAXN<<1];
struct rpg{
int li,nx,ln;
}a[MAXN<<1];
struct lint{
int ls,nx,ln;
}line[MAXN];
inline int read()
{
int x=0;char ch=getchar();
while(ch<'0'||'9'<ch) ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x;
}
void add(int ls,int nx,int ln)
{
a[++np]=(rpg){h[ls],nx,ln};h[ls]=np;
a[++np]=(rpg){h[nx],ls,ln};h[nx]=np;
}
void init()
{
n=read(),s=read(),m=read();
for(int i=1;i<=s;++i) c[i]=read();
for(int i=1;i<=m;++i) x[i]=read(),y[i]=read(),z[i]=read(),add(x[i],y[i],z[i]);
return;
}
void up(int x)
{
for(int i=x,j=i>>1;j;i=j,j>>=1){
if(ln[hp[i]]<ln[hp[j]]) swap(hp[i],hp[j]),swap(id[hp[i]],id[hp[j]]);
else break;
}return;
}
void ins(int x)
{
hp[++hp[0]]=x;
id[x]=hp[0];
up(hp[0]);
return;
}
void pop()
{
id[hp[1]]=0;
hp[1]=hp[hp[0]--];
id[hp[1]]=1;
for(int i=1,j=2;j<=hp[0];i=j,j<<=1){
if(j<hp[0]&&ln[hp[j+1]]<ln[hp[j]]) ++j;
if(ln[hp[i]]>ln[hp[j]]) swap(hp[i],hp[j]),swap(id[hp[i]],id[hp[j]]);
else break;
}return;
}
void SPkstra()
{
memset(ln,0x7f,sizeof(ln));
for(int i=1;i<=s;++i) ln[c[i]]=0,ins(c[i]),blg[c[i]]=c[i];
while(hp[0]){
int nw=hp[1];pop();
for(int i=h[nw];i;i=a[i].li){
if(ln[a[i].nx]>ln[nw]+a[i].ln){
ln[a[i].nx]=ln[nw]+a[i].ln;
blg[a[i].nx]=blg[nw];
if(id[a[i].nx]) up(id[a[i].nx]);
else ins(a[i].nx);
}
}
}return;
}
bool cmp(lint a,lint b){return a.ln<b.ln;}
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
void un(int a,int b){int fa=find(a),fb=find(b);if(fa!=fb) f[fa]=fb;}
void Krusbuild()
{
np=0;
memset(a,0,sizeof(a));
memset(h,0,sizeof(h));
for(int i=1;i<=m;++i) line[i]=(lint){blg[x[i]],blg[y[i]],ln[x[i]]+ln[y[i]]+z[i]};
for(int i=1;i<=n;++i) f[i]=i;
sort(line+1,line+m+1,cmp);
int ct=0;
for(int i=1;i<=m;++i){
if(find(line[i].ls)!=find(line[i].nx)){
un(line[i].ls,line[i].nx);
add(line[i].ls,line[i].nx,line[i].ln);
++ct;
}if(ct==s-1) break;
}return;
}
void dfs1(int x,int f,int tp)
{
fa[x]=f;
dep[x]=tp;
siz[x]=1;
for(int i=h[x];i;i=a[i].li){
if(a[i].nx==f) continue;
dfs1(a[i].nx,x,tp+1);
val[a[i].nx]=a[i].ln;
siz[x]+=siz[a[i].nx];
if(siz[sn[x]]<siz[a[i].nx]) sn[x]=a[i].nx;
}return;
}
void dfs2(int x,int tpx,int v)
{
id[x]=++id[0];
ren[id[x]]=val[x];
lis[x]=v;
top[x]=tpx;
if(!sn[x]) return;
dfs2(sn[x],tpx,max(v,val[sn[x]]));
for(int i=h[x];i;i=a[i].li){
if(a[i].nx==fa[x]||a[i].nx==sn[x]) continue;
dfs2(a[i].nx,a[i].nx,a[i].ln);
}return;
}
void build(int k,int l,int r)
{
if(l==r){
tree[k]=ren[l];
return;
}int i=k<<1,mid=l+r>>1;
build(i,l,mid);build(i|1,mid+1,r);
tree[k]=max(tree[i],tree[i|1]);
return;
}
void treecut()
{
id[0]=0;
for(int i=1;i<=s;++i) if(!dep[c[i]]) dfs1(c[i],c[i],1);
for(int i=1;i<=s;++i) if(!id[c[i]]) dfs2(c[i],c[i],0);
build(1,1,s);
return;
}
int cask(int k,int l,int r,int le,int ri)
{
if(le<=l&&r<=ri) return tree[k];
int i=k<<1,mid=l+r>>1,maxn=0;
if(le<=mid) maxn=max(maxn,cask(i,l,mid,le,ri));
if(mid<ri) maxn=max(maxn,cask(i|1,mid+1,r,le,ri));
return maxn;
}
int qmax(int x,int y)
{
int maxn=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]]) swap(x,y);
maxn=max(maxn,lis[x]);
x=fa[top[x]];
}if(dep[x]>dep[y]) swap(x,y);
if(id[x]+1<=id[y]) maxn=max(maxn,cask(1,1,s,id[x]+1,id[y]));
return maxn;
}
void solve()
{
m=read();
while(m--){
int x=read(),y=read(),d=read();
if(find(x)!=find(y)||qmax(x,y)>d) puts("NIE");
else puts("TAK");
}return;
}
int main()
{
init();
SPkstra();
Krusbuild();
treecut();
solve();
return 0;
}
[AMPPZ2014]Petrol的更多相关文章
- BZOJ 4144: [AMPPZ2014]Petrol
4144: [AMPPZ2014]Petrol Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 457 Solved: 170[Submit][Sta ...
- 4144: [AMPPZ2014]Petrol (多源最短路+最小生成树+启发式合并)
4144: [AMPPZ2014]Petrol Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 752 Solved: 298[Submit][Sta ...
- 【BZOJ4144】[AMPPZ2014]Petrol 最短路+离线+最小生成树
[BZOJ4144][AMPPZ2014]Petrol Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油 ...
- 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)
Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...
- 【BZOJ】4144: [AMPPZ2014]Petrol
题意 给定一个\(n\)个点.\(m\)条边的带权无向图,其中有\(s\)个点是加油站.每辆车都有一个油量上限\(b\),即每次行走距离不能超过\(b\),但在加油站可以补满.\(q\)次询问,每次给 ...
- BZOJ.4144.[AMPPZ2014]Petrol(Kruskal重构树)
BZOJ 看别人代码的时候发现哪一步都很眼熟,突然想起来,就在四个月前我好像看过还给别人讲过?mmp=v= 果然不写写就是容易忘.写了好歹忘了的时候还能复习呢(虽然和看别人的好像也没多少差别?). 首 ...
- [BZOJ4144][AMPPZ2014]Petrol[多源最短路+MST]
题意 题目链接 分析 假设在 \(a \rightarrow b\) 的最短路径中出现了一个点 \(x\) 满足到 \(x\) 最近的点是 \(c\) ,那么我们完全可以从 \(a\) 直接走到 \( ...
- BZOJ4144: [AMPPZ2014]Petrol(最短路 最小生成树)
题意 题目链接 Sol 做的时候忘记写题解了 可以参考这位大爷 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...
- bzoj4144 [AMPPZ2014]Petrol
link 题意: 给一个n个点m条边的带权无向图,其中k个点是加油站,每个加油站可以加满油,但不能超过车的油量上限.有q个询问,每次给出x,y,b,保证x,y都是加油站,问一辆油量上限为b的车从x出发 ...
随机推荐
- Windows 内核漏洞学习—空指针解引用
原标题:Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/w ...
- [SqlServer] Error: 15023
Use DataBaseName go sp_change_users_login 'update_one', 'UserName', 'UserName' 恢复数据库后,添加用户,报错号15023 ...
- JS:函数柯里化
函数柯里化 柯里化 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术. 简单来说,就 ...
- js集合set类的实现
js集合set类的实现 /*js集合set类的实现*/ function Set() { this.dataStore = []; this.add = add;//新增元素 this.remove ...
- (转)MYSQL线程池总结(一)
MYSQL线程池总结(一) 原文:http://www.cnblogs.com/cchust/p/4510039.html 线程池是Mysql5.6的一个核心功能,对于服务器应用而言,无论是web应 ...
- Java后台 解析JSON的几个方法
1.对象转JSON对象. public static void main(String[] args) { Domain demo = new Domain( "在线JSON校验格式化工具 ...
- JVM-垃圾收集算法、垃圾收集器、内存分配和收集策略
对象已死么? 判断一个对象是否存活一般有两种方式: 1.引用计数算法:每个对象都有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1.计数为0时可以回收. 2.可达性分析算法(Reachab ...
- docker - 修改镜像/容器文件或者 "Docker root dir" 的在宿主机上的存储位置
背景 之前在使用docker的时候,由于启动container的时候用的是默认的mount(路径为 /var/lib/docker),这个目录对应的硬盘空间有限,只有200G左右.现在随着程序运行,有 ...
- Spring Boot 使用Redis
转载自:http://www.cnblogs.com/ityouknow/p/5748830.html Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化 ...
- 这个PHP无解深坑,你能解出来吗?(听说能解出来的都很秀)
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由horstxu发表于云+社区专栏 1. 问题背景 PHP Laravel框架中的db migration是比较常用的一个功能了.在每个 ...