当前位置: 首页 > 编程日记 > 正文

[SDOI2017]天才黑客

传送门

Description

给出一张带边权的有向图,每个边都上都有一个字符串(给出对应Trie树上的节点),一条路径的长度为路径上的边权之和+相邻两条边的字符串的lcp长度之和。

求从1到其它节点的最短路

Solution

预备部分

  • 首先,两个字符串的lcp,就是对应节点在Trie树上的lca的深度值。

  • 把每条边拆成两对入点和出点,分别是\(r1,r2,c1,c2\),它们之间的边权值都是原来的边权:

    大概像这样?[图1]

    1129554-20190316131041261-1857313215.png

  • 建一个源点S,向所有原先入点是1的点连边权为0的边

  • 然后枚举原图中的每个点\(x\),把所有形如\(<i,x>,<x,j>\)的边都连接在一起,使得边权就是两两字符串的\(lcp\)大小

  • 求出原图对于源点的最短路

  • 最后,对于一个点\(x\),枚举所有\(<i,x>\)的边,取它们中出点最小的\(dis\)

可是一个点的入边和出边会有很多,所以连出的边数大概是是\(O(n^2)\)的,显然不行

所以我们考虑优化建图:

接下来介绍前后缀优化建图

首先,之前把一条边拆成两对出点和入点,其中一对用来处理后缀,一对用来处理前缀

对于一个点,我们以前缀为例子:

  1. 按照每条边对应字符串在Trie树上的\(dfs\)序排序,上面是入边(\(c1\)点),下面是出边(\(r1\)点):

    [图2]

    1129554-20190316131057181-638456380.png

  2. 上下分别按照顺序连边权为\(0\)的有向边

    [图3]

    1129554-20190316131116453-1489657496.png

  3. 考虑到一个性质\(lcp(a_1,a_n)=\min_{i=1}^{n-1} lcp(a_i,a_i+1)\)

  4. 考虑dfs序相邻的两点\(x_i,x_{i+1}\)(有可能都是入点或出点),计算出\(lcp(x_i,x_{i+1})\),考虑它们的影响范围,显然,我们找到序号最大且小于等于\(i\)的入边\(c1_k\)和序号大于等于\(i+1\)的出边\(r1_j\),连边\(<c1_k,r1_j>\),长度为\(lcp(x_i,x_{i+1})\)

    [图4]

    1129554-20190316131136385-971455410.png

这样,就可以满足一个序号小的入边到任意一个序号比它大的出边之间的最短路就是它们的\(lcp\)

这是前缀优化,当然后缀优化部分与之类似,这里就不再赘述




最后,分享一下最短路的写法,貌似也不会快多少吧。。。

const ll nN=262144,inf=20000000000;
ll d[MM<<2];
struct node{ll x;int f;}t[nN<<1];
inline node Min(const node&o,const node&oo){return o.x<oo.x?o:oo;}
inline void rw(int k,ll x){for(t[k+=nN].x=x;k>>=1;)t[k]=Min(t[k<<1],t[k<<1|1]);}
inline void dij()
{reg int i,x;++tt;for(i=cc[1].size()-1;~i;--i)Ins(tt,cc[1][i]*4-3,0),Ins(tt,cc[1][i]*4-1,0);for(i=1;i<nN<<1;++i) t[i].x=inf;for(i=1;i<=tt;++i) d[t[i+nN].f=i]=inf;for(rw(tt,d[tt]=0);t[1].x!=inf;){rw(x=t[1].f,inf);for(i=hr[x];i;i=e[i].nex)if(d[e[i].to]>d[x]+e[i].w)rw(e[i].to,d[e[i].to]=d[x]+e[i].w);}
}


Code 

#include<bits/stdc++.h>
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;
}
#define reg register
#define ME(x) memset(x,0,sizeof x)
const int MK=20005,MN=50005,MM=50005;
int N,M,K,dfn[MK];
class Tire
{private: int fa[MK],dep[MK],top[MK],mx[MK],siz[MK],dind;struct ed{int to,nex;}e[MK];int hr[MK],en,vis[MK];inline void Ins(int x,int y){e[++en]=(ed){y,hr[x]};hr[x]=en;}void dfs1(int x,int d){dep[x]=d;siz[x]=1;for(reg int i=hr[x];i;i=e[i].nex)dfs1(e[i].to,d+1),siz[x]+=siz[e[i].to],(siz[e[i].to]>siz[mx[x]])?mx[x]=e[i].to:0;}void dfs2(int x,int tp){top[x]=tp;if(mx[x])dfs2(mx[x],tp);dfn[x]=++dind;for(reg int i=hr[x];i;i=e[i].nex)if(e[i].to^mx[x])dfs2(e[i].to,e[i].to);}public:inline void init(){ME(vis);ME(hr);ME(fa);ME(dep);ME(top);ME(mx);ME(siz);en=dind=0;}inline void ins(int x,int y,int w){Ins(x,y);fa[y]=x;}inline void build(){dfs1(1,0);dfs2(1,1);}inline int lca(int x,int y){for(;top[x]^top[y];)dep[top[x]]<dep[top[y]]?y=fa[top[y]]:x=fa[top[x]];return min(dep[x],dep[y]);}
}trie;
int tt;
struct edge{int to,w,nex;}e[MM*20];int en,hr[MM<<2];
int pos[MM],idt;
bool cmp(const int&o,const int&oo){return dfn[pos[std::abs(o)]]<dfn[pos[std::abs(oo)]];}
std::vector<int> rr[MN],cc[MN];
int tmp[MM],nn;
inline void Ins(int x,int y,int c){e[++en]=(edge){y,c,hr[x]};hr[x]=en;}
inline void ins(int x,int y,int c,int w)
{pos[++idt]=w;Ins(tt+1,tt+2,c);Ins(tt+1,tt+4,c);Ins(tt+3,tt+2,c);Ins(tt+3,tt+4,c);rr[y].push_back(idt);cc[x].push_back(idt);tt+=4;
}
inline void Build(int x)
{if(!rr[x].size()||!cc[x].size()) return;std::sort(rr[x].begin(),rr[x].end(),cmp);std::sort(cc[x].begin(),cc[x].end(),cmp);reg int t,i,j,len;nn=0;for(i=rr[x].size()-1;i>0;--i)Ins(rr[x][i-1]*4-2,rr[x][i]*4-2,0),Ins(rr[x][i]*4,rr[x][i-1]*4,0);for(i=cc[x].size()-1;i>0;--i)Ins(cc[x][i-1]*4-3,cc[x][i]*4-3,0),Ins(cc[x][i]*4-1,cc[x][i-1]*4-1,0);for(i=cc[x].size()-1;~i;--i) tmp[++nn]=-cc[x][i];for(i=rr[x].size()-1;~i;--i) tmp[++nn]=rr[x][i];std::sort(tmp+1,tmp+nn+1,cmp);for(t=1,i=j=0;t<nn;++t) {if(tmp[t]<0)++j,tmp[t]=-tmp[t];else ++i;len=trie.lca(pos[std::abs(tmp[t])],pos[std::abs(tmp[t+1])]);if(i!=0&&j!=cc[x].size())Ins(rr[x][i-1]*4-2,cc[x][j]*4-3,len);if(j!=0&&i!=rr[x].size())Ins(rr[x][i]*4,cc[x][j-1]*4-1,len);}
}
const ll nN=262144,inf=20000000000;
ll d[MM<<2];
struct node{ll x;int f;}t[nN<<1];
inline node Min(const node&o,const node&oo){return o.x<oo.x?o:oo;}
inline void rw(int k,ll x){for(t[k+=nN].x=x;k>>=1;)t[k]=Min(t[k<<1],t[k<<1|1]);}
inline void dij()
{reg int i,x;++tt;for(i=cc[1].size()-1;~i;--i)Ins(tt,cc[1][i]*4-3,0),Ins(tt,cc[1][i]*4-1,0);for(i=1;i<nN<<1;++i) t[i].x=inf;for(i=1;i<=tt;++i) d[t[i+nN].f=i]=inf;for(rw(tt,d[tt]=0);t[1].x!=inf;){rw(x=t[1].f,inf);for(i=hr[x];i;i=e[i].nex)if(d[e[i].to]>d[x]+e[i].w)rw(e[i].to,d[e[i].to]=d[x]+e[i].w);}
}
inline ll getans(int x)
{reg ll i,ans=inf;for(i=rr[x].size()-1;~i;--i)ans=min(ans,min(d[rr[x][i]*4-2],d[rr[x][i]*4]));return ans;
}
inline void init()
{nn=tt=en=idt=0;ME(hr);ME(pos);ME(tmp);ME(dfn);for(reg int i=1;i<=N;++i) rr[i].clear(),cc[i].clear();
}
int main()
{reg int T=read();while(T--) {N=read(),M=read(),K=read();trie.init();reg int i,x,y,c;for(i=1;i<=M;++i) x=read(),y=read(),c=read(),ins(x,y,c,read());for(i=1;i<K;++i) x=read(),y=read(),trie.ins(x,y,read()); trie.build();for(i=2;i<=N;++i) Build(i);dij();for(i=2;i<=N;++i) printf("%lld\n",getans(i));init();}
}



Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/sdoi2017_hacks.html

相关文章:

spine - unity3D(摘自博主softimagewht)

摘自&#xff1a;&#xff08;博主 http://www.cnblogs.com/softimagewht/p/4149118.html&#xff09; //skeletonDataSkeletonAnimation skeletonAnimation GetComponent<SkeletonAnimation>();Debug.Log(skeletonAnimation.name);//获取角色名Debug.Log(skeletonAnima…

Windows搜索工具 — Everything

everything 主页 &#xff1a;https://www.voidtools.com/zh-cn/ Everything&#xff1a;是 Windows 上一款搜索引擎&#xff0c;它能够基于文件名快速定文件和文件夹位置。 下载链接&#xff1a;https://www.voidtools.com/zh-cn/downloads/ —— END ——

向访客和爬虫显示不同的内容

为了提高网页的用户体验, 我们经常会做一些对搜索引擎不太友好的事情, 但某些情况下这并不是无法挽回的, 可以通过向自然人和搜索引擎机器人显示不同的内容来提供好的用户体验和 SEO. 听说本方法会触犯搜索引擎的一些操作原则, 有可能被被各搜索引擎处罚, 甚至删除网站. 所以我…

php取url后的文件名

<? $a"http://www.esyu.com.cn/images/aaa.gif"; echo substr($a,strrpos($a,"/")1); ?>

ES6 函数的扩展

ES6 函数的扩展1. 函数参数的默认值1.1 基本用法1.2 与解构赋值默认值结合使用1.3 参数默认值的位置1.4 函数的length属性2. rest参数2.1 rest参数2.2 arguments对象3. 函数的name属性4. 箭头函数1. 函数参数的默认值 1.1 基本用法 ES6之前&#xff0c;不能直接为函数的参数指…

Mycat分片规则详解

1、分片枚举 通过在配置文件中配置可能的枚举 id&#xff0c;自己配置分片&#xff0c;本规则适用于特定的场景&#xff0c;比如有些业务需要按照省份或区县来做保存&#xff0c;而全国省份区县固定的&#xff0c;这类业务使用本条规则&#xff0c;配置如下&#xff1a; <ta…

COGS 2769. mk去撸串

【题目描述】 今天 mk 去撸串 ,恰逢店里活动 ,如果吃一种串串超过记录, 可以 赠送 328, 所以 mk 想知道他吃的串串中吃的最多的种类是什么. 【输入格式】 第一行一个整数 1<n<50000; 然后有 n 行长度<100 的全部由小写字母组成的字符串;每个代表一种串串 【输出格式】…

C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie

由于种种原因&#xff0c;我们有时需要从互联网上抓取一些资料&#xff0c;有些页面可以直接打开&#xff0c;而有些页面必登录之后才能打开。本文介绍的是使用 HttpWebRequest 和 HttpWebResponse 自动填写提交 ASP.NET 表单并保持 Session 和 Cookie 的一个完整的例子。这里涉…

rman备份后为什么要同时备份归档日志

今天在CU上看到有人问一个问题&#xff1a;rman备份后为什么要同时备份归档日志呢&#xff0c;既然rman是物理备份&#xff0c;所有数据已经都备份&#xff0c;再次备份归档日志何用&#xff1f;思考了一下&#xff0c;认为有必要记录一下为什么要备份归档日志&#xff1a;其实…

Angular响应式表单及表单验证

1. 什么是响应式表单&#xff1f; 响应式表单提供了一种模型驱动的方式来处理表单输入&#xff0c;其中的值会随时间而变化。 响应式表单使用显示的&#xff0c;不可变的方式&#xff0c;管理表单在特定时间点上的状态。对表单状态的每一次变更都会返回一个新的状态&#xff…

void *指针的加减运算

1、手工写了一个程序验证void *指针加减运算移动几个字节&#xff1a; //本程序验证空类型指针减1移动几个字节 #include <stdio.h> int main(int argc, char *argv[]) {int a10,b20;int *pa&a;void …

ASP.NET运行原理

一个ASP.NET的应用程序是开始于IIS的. 当你请求一个包含ASP.NET应用的网址时,IIS接受到请求(IIS是WEB服务守候进程),IIS收到请求后,会根据请求者请求的主机头或者IP或者端口号来找到对应的站点. 当找到站点后,如果你请求的资源是以ASPX为结尾的WEBFORM,时,IIS会将控制权交给一…

vue 树形下拉框 亲测 好用

https://vue-treeselect.js.org/ 顺带说一个开发中使用这个组件遇到的问题&#xff0c;关于回显之后无法修改的问题 找了很长时间 原因是数据类型导致的问题&#xff0c;数组里面应该是数字类型&#xff0c;直接转数组的话里面的值都是字符串&#xff0c;所有得额外做处理了转…

通过xmanager远程连接redhat linux as 5

通过xmanager远程连接redhat linux as 5 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />rhel5与rhel4不同的地方是&#xff0c;rhel5里没有/etc/X11/gdm/这个目录&#xff0c;rhel5的gdm的配置文件放在这里/usr/share/gdm/defa…

bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)

链接&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id1264 思路&#xff1a; n大小为20000*5&#xff0c;而一般的dp求最长公共子序列复杂度是 n*n的&#xff0c;所以我们必须优化。 题目说了一个数会出现5次&#xff0c;那么我们可以预处理得到 第一个序列a[]每…

C语言第二次博客作业---分支结构

C语言第二次博客作业---分支结构 一&#xff0c;PTA实验作业 题目1.计算分段函数 本题目要求计算下列分段函数f(x)的值 1.代码 double x, result;scanf("%lf", &x);if (x >0)result sqrt(x);elseresult pow( x 1, 2) 2 * x 1 / x;printf ("f(%.2f) …

Lazy.NET

.NET 4.0里&#xff0c;在System名称空间中多了一个名为Lazy<T>新泛型类&#xff0c;该类的作用正如其名称所示。下面给出了一个使用的例子&#xff1a;1 var lazy newLazy<IList<OrderRow>>(2 () >3 {4 var rows //get order rows;5 returnrows;6 });7 8…

Angular 组件交互

Angular 组件交互 组件交互&#xff1a; 组件通讯&#xff0c;让两个或多个组件之间共享信息。 使用场景&#xff1a; 当某个功能在多个组件中被使用到时&#xff0c;可以将该特定的功能封装在一个子组件中&#xff0c;在子组件中处理特定的任务或工作流。 交互方式&#xff1…

java-在应用中获取spring定义的bean

因为写了些bean作为quartz的任务用spring配置了&#xff0c;但有些时候需要在别的类中使用这些bean&#xff0c;没有太仔细去研究spring&#xff0c;依稀记得有个getBean&#xff0c;到网上g了一把&#xff0c;发现方法不止一种&#xff0c;选了一种最简单的方法&#xff1a; 主…

Enterprise Architect 7 入门教程 1

一&#xff0e; 简介生命周期软件设计方案——Enterprise Architect是以目标为导向的软件系统。它覆盖了系统开发的整个周期&#xff0c;除了开发类模型之外&#xff0c;还包括事务进程分析&#xff0c;使用案例需求&#xff0c;动态模型&#xff0c;组件和布局&#xff0c;系…

FCS省选模拟赛 Day5

传送门 Solution Code #include<bits/stdc.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) inline int read() {int x0,f1;char chgetchar();while(ch<0||ch>9){if(ch-)f-1;chgetchar();}while(ch>…

python中的单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的软件设计模式&#xff0c;该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中&#xff0c;某个类只能出现一个实例时&#xff0c;单例对象就能派上用场。 比如&#xff0c;某个服务器程序的…

JavaScript 数据类型转换

1. typeof 操作符 使用typeof操作符来检测变量的数据类型。 使用方式&#xff1a;typeof 变量名 或者 typeof(变量名) 返回结果&#xff1a; number、string、boolean、object、undefined、function typeof {} // 返回object typeof [] // 返回object typeof null // 返回o…

Cisco asa 5510升级IOS和ASDM

Cisco asa <?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" />5510升级IOS和ASDMshow version 查看当前运行的系统信息&#xff0c;包括启动文件&#xff08;即IOS)等 show boot 查看当…

Angular 服务

服务的概念 服务是在多个“互相不知道”的类之间共享信息的好办法。—— 官方文档 可以理解为组件中需要的数据源是由服务提供的&#xff0c;也可以理解为组件类中的方法通过调用服务中的方法向服务器请求数据。 Injectable() 服务 服务类需要导入Injectable符号并需要加上Inj…

[Linux] 029 脚本安装包

1. 脚本安装包 脚本安装包并不是独立的软件包类型&#xff0c;常见安装的是源码包是人为把安装过程写成了自动安装的脚本&#xff0c;只要执行脚本&#xff0c;定义简单的参数&#xff0c;就可以完成安装非常类似于 Windows 下软件的安装方式2. Webmin 的作用 Webmin 是一个基于…

基于Android平台扫码识别并链接服务器demo

资料在我的网盘&#xff1a;Android文件夹   第一&#xff1a;开发平台搭建。 本项目采用Android studio&#xff08;android-studio-bundle-162.4069837-windows.exe&#xff09;作为开发平台&#xff0c;安装JDK&#xff08;jdk-8u144-windows-x64.exe&#xff09;。 下载对…

WCF学习笔记(二):在WCF中使用集合传输数据

最近的开发&#xff0c;一直被DataContract头疼&#xff0c;微软为了更好的通用性和代码无关性&#xff0c;将DataContract进行了一系列的优化&#xff0c;使作为DataContract的类在进行Serialize的时候会被序列化成非常通用的数据格式&#xff0c;可以在任何开发语言中调用。但…

如何面对“大概什么时候能完成?”

你在听着经理、上级或是公司内部的某类用户滔滔不绝的给你讲需求&#xff0c;这里面常常能听到“最好能加上……”&#xff0c;“我希望……”&#xff0c;你一边听着&#xff0c;一边心里盘算着这些需求背后需要怎样的技术支撑&#xff0c;要采纳的方案&#xff0c;然后你看到…

Angular Http

Http服务 HttpClient 是 Angular 通过 HTTP 与远程服务器通讯的机制。 启用Http服务的准备工作 要让 HttpClient 在应用中随处可用&#xff0c;需要在根模块的NgModule.imports 数组中加入 HttpClientModule。 Http方法返回单个值 HTTP 是一个请求/响应式协议。你发起请求&am…