题面

传送门

题解

去看\(shadowice\)巨巨写得前后缀优化建图吧

话说我似乎连线段树优化建图的做法都不会

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define pb push_back
#define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
#define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
char sr[1<<21],z[20];int C=-1,Z=0;
inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
void print(R ll x){
if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
while(z[++Z]=x%10+48,x/=10);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
int n,m,k,dfn[20005],dep[20005];
namespace Tr{
const int N=2e4+5;
struct eg{int v,nx;}e[N];int head[N],tot;
inline void add(R int u,R int v){e[++tot]={v,head[u]},head[u]=tot;}
int top[N],fa[N],sz[N],son[N],cnt;
void dfs1(int u){
sz[u]=1,dep[u]=dep[fa[u]]+1;
go(u)if(v!=fa[u]){
fa[v]=u,dfs1(v),sz[u]+=sz[v];
sz[v]>sz[son[u]]?son[u]=v:0;
}
}
void dfs2(int u,int t){
top[u]=t,dfn[u]=++cnt;
if(!son[u])return;
dfs2(son[u],t);
go(u)if(!top[v])dfs2(v,v);
}
inline int LCA(R int u,R int v){
while(top[u]!=top[v]){
dep[top[u]]<dep[top[v]]?(swap(u,v),0):0;
u=fa[top[u]];
}return dep[u]<dep[v]?u:v;
}
inline void init(){dep[0]=-1;dfs1(1),dfs2(1,1);}
inline void clr(){fp(i,1,k)head[i]=fa[i]=son[i]=top[i]=0;tot=cnt=0;}
}
namespace Gr{
const int N=5e4+5,V=(N<<2)+5,E=N*20+5;
struct eg{int v,nx,w;}e[E];int head[V],tot;
inline void add(R int u,R int v,R int w){e[++tot]={v,head[u],w},head[u]=tot;}
vector<int>eof[N],eif[N],eob[N],eib[N],tr;
int tp[V],S,cnt;
inline bool cmp(const int &x,const int &y){return dfn[tp[x]]<dfn[tp[y]];}
void ins(int u,int v,int w,int d){
u==1?(add(S,cnt+1,0),add(S,cnt+3,0),0):0,
tp[cnt+1]=tp[cnt+2]=tp[cnt+3]=tp[cnt+4]=d,
add(cnt+1,cnt+2,w),add(cnt+1,cnt+4,w),add(cnt+3,cnt+2,w),add(cnt+3,cnt+4,w),
eof[u].pb(++cnt),eif[v].pb(++cnt),eob[u].pb(++cnt),eib[v].pb(++cnt);
}
void build(){
fp(u,1,n){
sort(eof[u].begin(),eof[u].end(),cmp),
sort(eif[u].begin(),eif[u].end(),cmp),
sort(eob[u].begin(),eob[u].end(),cmp),
sort(eib[u].begin(),eib[u].end(),cmp);
fp(i,0,eof[u].size()-2)add(eof[u][i],eof[u][i+1],0);
fp(i,0,eif[u].size()-2)add(eif[u][i],eif[u][i+1],0);
fp(i,0,eob[u].size()-2)add(eob[u][i+1],eob[u][i],0);
fp(i,0,eib[u].size()-2)add(eib[u][i+1],eib[u][i],0);
tr.resize(eof[u].size()+eif[u].size());
int s1=eof[u].size(),s2=eib[u].size();
merge(eof[u].begin(),eof[u].end(),eif[u].begin(),eif[u].end(),tr.begin(),cmp);
for(R int t=0,i=0,j=0,s=tr.size()-1,w;t<s;++t){
tr[t]&1?++j:++i,w=dep[Tr::LCA(tp[tr[t]],tp[tr[t+1]])];
(i&&j!=s1)?(add(eif[u][i-1],eof[u][j],w),0):0,
(j&&i!=s2)?(add(eib[u][i],eob[u][j-1],w),0):0;
}
}
}
struct node{
int u;ll d;
node(){}
node(R int uu,R ll dd):u(uu),d(dd){}
inline bool operator <(const node &b)const{return d>b.d;}
};priority_queue<node>q;
int vis[V];ll dis[V];
void dijkstra(){
fp(i,1,cnt)dis[i]=(1ll<<60);
q.push(node(S,dis[S]=0));
int u;
while(!q.empty()){
u=q.top().u,q.pop();if(vis[u])continue;vis[u]=1;
go(u)cmin(dis[v],dis[u]+e[i].w)?(q.push(node(v,dis[v])),0):0;
}
fp(i,2,n){
ll res=(1ll<<60);
fp(j,0,eif[i].size()-1)cmin(res,dis[eif[i][j]]);
fp(j,0,eib[i].size()-1)cmin(res,dis[eib[i][j]]);
print(res);
}
}
void clr(){
fp(i,1,n){
vector<int>().swap(eof[i]),
vector<int>().swap(eif[i]),
vector<int>().swap(eob[i]),
vector<int>().swap(eib[i]);
}
fp(i,1,cnt+1)head[i]=vis[i]=0;
cnt=tot=0;
}
}
void solve(){
n=read(),m=read(),k=read(),Gr::S=(m<<2)+1;
for(R int i=1,u,v,w,d;i<=m;++i)u=read(),v=read(),w=read(),d=read(),Gr::ins(u,v,w,d);
for(R int i=1,u,v,w;i<k;++i)u=read(),v=read(),w=read(),Tr::add(u,v);
Tr::init(),Gr::build(),Gr::dijkstra();
}
int main(){
// freopen("testdata.in","r",stdin);
for(int T=read();T;--T)solve(),Tr::clr(),Gr::clr();
return Ot(),0;
}

洛谷P3783 [SDOI2017]天才黑客(前后缀优化建图+虚树+最短路)的更多相关文章

  1. 洛谷 P3783 - [SDOI2017]天才黑客(前后缀优化建图)

    题面传送门 神仙题一道. 首先注意到这里的贡献涉及到边的顺序,并且只与相邻的边是什么有关,因此不难想到一个做法--边转点,点转边,具体来说对于每条边 \(e\),我们将其拆成两个点 \(in_e,ou ...

  2. Codeforces 587D - Duff in Mafia(2-SAT+前后缀优化建图)

    Codeforces 题面传送门 & 洛谷题面传送门 2-SAT hot tea. 首先一眼二分答案,我们二分答案 \(mid\),那么问题转化为,是否存在一个所有边权都 \(\le mid\ ...

  3. 【SDOI2017】天才黑客(前后缀优化建图 & 最短路)

    Description 给定一张有向图,\(n\) 个点,\(m\) 条边.第 \(i\) 条边上有一个边权 \(c_i\),以及一个字符串 \(s_i\). 其中字符串 \(s_1, s_2, \c ...

  4. 洛谷3783 SDOI2017 天才黑客(最短路+虚树+边转点+线段树优化建图)

    成功又一次自闭了 怕不是猪国杀之后最自闭的一次 一看到最短路径. 我们就能推测这应该是个最短路题 现在考虑怎么建图 根据题目的意思,我们可以发现,在本题中,边与边之间存在一些转换关系,但是点与点之间并 ...

  5. 洛谷 P5331 - [SNOI2019]通信(CDQ 分治优化建图+费用流)

    题面传送门 首先熟悉网络流的同学应该能一眼看出此题的建模方法: 将每个点拆成两个点 \(in_i,out_i\),连一条 \(S\to in_i\),容量为 \(1\) 费用为 \(0\) 的边 连一 ...

  6. Luogu P3783 [SDOI2017]天才黑客

    题目大意 一道码量直逼猪国杀的图论+数据结构题.我猪国杀也就一百来行 首先我们要看懂鬼畜的题意,发现其实就是在一个带权有向图上,每条边有一个字符串信息.让你找一个点出发到其它点的最短路径.听起来很简单 ...

  7. 洛谷P3994 Highway(树形DP+斜率优化+可持久化线段树/二分)

    有点类似NOI2014购票 首先有方程$f(i)=min\{f(j)+(dep_i-dep_j)*p_i+q_i\}$ 这个显然是可以斜率优化的... $\frac {f(j)-f(k)}{dep_j ...

  8. [SDOI2017]天才黑客[最短路、前缀优化建图]

    题意 一个 \(n\) 点 \(m\) 边的有向图,还有一棵 \(k\) 个节点的 trie ,每条边上有一个字符串,可以用 trie 的根到某个节点的路径来表示.每经过一条边,当前携带的字符串就会变 ...

  9. 【LG3783】[SDOI2017]天才黑客

    [LG3783][SDOI2017]天才黑客 题面 洛谷 题解 首先我们有一个非常显然的\(O(m^2)\)算法,就是将每条边看成点, 然后将每个点的所有入边和出边暴力连边跑最短路,我们想办法优化这里 ...

随机推荐

  1. Linux实战教学笔记15:磁盘原理

    第十五节 磁盘原理 标签(空格分隔): Linux实战教学笔记 1,知识扩展 非脚本方式的一条命令搞定批量创建用户并设置随机10位字母数字组合密码. 1.1 sed的高级用法 [root@chensi ...

  2. 在zookeeper集群的基础上,搭建伪solrCloud集群

    伪集群的搭建:将solrCloud搭建到同一台机器上. 准备工作 1 将在window中部署的单机版solr上传到服务器(虚拟机)中 solr的简单部署:在tomcat中启动slor 的内容 这一次放 ...

  3. 欲望都市游戏设计 背景图层和UI图层的设计

  4. 互联网大规模数据分析技术(自主模式)第五章 大数据平台与技术 第10讲 大数据处理平台Hadoop

    大规模的数据计算对于数据挖掘领域当中的作用.两大主要挑战:第一.如何实现分布式的计算 第二.分布式并行编程.Hadoop平台以及Map-reduce的编程方式解决了上面的几个问题.这是谷歌的一个最基本 ...

  5. SEL 类型

    1.SEL类型的第一个作用, 配合对象/类来检查对象/类中有没有实现某一个方法 SEL sel = @selector(setAge:); Person *p = [Person new]; // 判 ...

  6. c++ 备忘录模式(memento)

    备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态[DP].举个简单的例子,我们玩游戏时都会保存进度,所保存的进度以文件的 ...

  7. EasyBuy项目总结_20180409

    一.项目技术点 1.熟练使用jsp及el和jstl表达式 el: $() jstl: 1.导包; 2.声明<%@ taglib uri=" " preffix="c ...

  8. Tomcat安装 以Linux 分支 Ubuntu Server 为例

    以Linux 分支 Ubuntu Server 为例.一.相关目录及作用说明 /etc/tomcat6 - 全局配置 /usr/share/tomcat6/ - 程序主目录 /usr/share/to ...

  9. [C++] Lvalue and Rvalue Reference

    Lvalue and Rvalue Reference int a = 10;// a is in stack int& ra = a; // 左值引用 int* && pa ...

  10. TCP、UDP、HTTP、SOCKET之间的区别与联系-乾颐堂CCIE

    IP:网络层协议: TCP和UDP:传输层协议: HTTP:应用层协议: SOCKET:TCP/IP网络的API. TCP/IP代表传输控制协议/网际协议,指的是一系列协议. TCP和UDP使用IP协 ...