LOJ2718

BZOJ5415

洛谷P4768


Rank3+Rank1无压力

BZOJ最初还不是一道权限题...

Update 2019.1.5

UOJ上被hack了....好像是纯一条链的数据过不了,不管了....现在不想改。

容易想到按高度Kruskal重构树+预处理到点1的距离dis。

建一棵最大生成树,如果随便建的话,如果非树边能走,整棵树都能走答案当然是0...;如果有些树边不能走,那么可走范围被限制在了某个连通块。

然而被限制在某个连通块和图(还要暴力,难道树分块?)没什么区别,所以我们可以让生成树边的高度由叶子向上递减,这样每次询问 找到深度最小的可行点后,答案就是其子树dis最小值(树形态显然不会影响什么)。

就是在Kruskal合并两个集合时,新建一个节点作为两集合的并的代表节点,最低高度mn为这条边权(当然不会比两集合中的大),dis为两集合dis的min。新树叶子节点即为原所有节点。

昨天一时zz怎么就觉得Kruskal不对呢。。

//8079ms	51424K(LOJ)
//洛谷 4860ms 50.49MB + 4392ms 50.33MB
#include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 400000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
#define mp std::make_pair
#define pr std::pair<int,int>
const int N=2e5+5,M=8e5+5,INF=0x7fffffff; int n,m,tot,Enum,H[N],nxt[M],to[M],len[M],dis[N],fa[N<<1][19],mn[N<<1],anc[N<<1],Ans[N<<1];
std::priority_queue<pr> q;
char IN[MAXIN],*SS=IN,*TT=IN;
struct Edge
{
int fr,to,h;
Edge() {}
Edge(int fr,int to,int h):fr(fr),to(to),h(h) {}
bool operator <(const Edge &x)const{
return h>x.h;
}
}e[M>>1]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline void AddEdge(int _h,int w,int u,int v)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, len[Enum]=w;
to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum, len[Enum]=w;
e[Enum>>1]=Edge(u,v,_h);
}
void Dijkstra()
{
static bool vis[N];
memset(dis,0x3f,sizeof dis), memset(vis,0,sizeof vis);
dis[1]=0, q.push(mp(0,1));
while(!q.empty())
{
int x=q.top().second; q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int v,i=H[x]; i; i=nxt[i])
if(dis[v=to[i]]>dis[x]+len[i])
dis[v]=dis[x]+len[i], q.push(mp(-dis[v],v));
}
}
int Get_fa(int x){
return x==anc[x]?x:anc[x]=Get_fa(anc[x]);
}
void Kruskal()
{
for(int i=1; i<=n; ++i) anc[i]=i, Ans[i]=dis[i];
int m=Enum>>1; std::sort(e+1,e+1+m);
for(int r1,r2,k=1,i=1; i<=m; ++i)
{
if((r1=Get_fa(e[i].fr))==(r2=Get_fa(e[i].to))) continue;
anc[r1]=anc[r2]=fa[r1][0]=fa[r2][0]=++tot, anc[tot]=fa[tot][0]=tot/*!*/;//清空新建的fa[tot]!(可能作为根节点)
mn[tot]=e[i].h, Ans[tot]=std::min(Ans[r1],Ans[r2]);
if(++k==n) break;
}
}
void Init_ST()
{
for(int i=1; i<=18; ++i)
for(int x=1; x<=tot; ++x) fa[x][i]=fa[fa[x][i-1]][i-1];
}
inline int Solve(int p,int ht)
{
for(int i=18; ~i; --i)
if(mn[fa[p][i]]>ht) p=fa[p][i];
return Ans[p];
} int main()
{
// freopen("return.in","r",stdin);
// freopen("return.out","w",stdout); int Case=read();
while(Case--)
{
Enum=0, memset(H,0,sizeof H);
tot=n=read(), m=read();
while(m--) AddEdge(read(),read(),read(),read());
Dijkstra(), Kruskal(), Init_ST(); int Q=read(),K=read(),S=read(),ans=0,pos,ht;
if(K) while(Q--)
pos=(read()+ans-1)%n+1,ht=(read()+ans)%(S+1),printf("%d\n",ans=Solve(pos,ht));
else while(Q--)
pos=read(),ht=read(),printf("%d\n",Solve(pos,ht));
}
return 0;
}

LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)的更多相关文章

  1. BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...

  2. BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增+最短路

    BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好久不 ...

  3. [NOI2018]归程 kruskal重构树

    [NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...

  4. [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)

    洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...

  5. 洛谷P4768 [NOI2018]归程(Kruskal重构树)

    题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...

  6. BZOJ 5415: [Noi2018]归程(kruskal重构树)

    解题思路 \(NOI2018\)的\(Day1\) \(T1\),当时打网络赛的时候不会做.学了一下\(kruskal\)重构树后发现问题迎刃而解了.根据\(kruskal\)的性质,如果要找从\(u ...

  7. NOI2018Day1T1 归程 并查集 kruskal kruskal重构树 倍增表 Dijkstra

    原文链接https://www.cnblogs.com/zhouzhendong/p/NOI2018Day1T1.html 题目传送门 - 洛谷P4768 题意 给定一个无向连通图,有 $n$ 个点 ...

  8. NOI Day1T1归程(Kruskal重构树+Dijkstra)

    NOI Day1T1归程(Kruskal重构树+Dijkstra) 题目 洛谷题目传送门 题解 其实我不想写......,所以...... 挖个坑......我以后一定会补的 luogu的题解讲的还是 ...

  9. LOJ #2718. 「NOI2018」归程(Dijkstra + Kruskal重构树 + 倍增)

    题意 给你一个无向图,其中每条边有两个值 \(l, a\) 代表一条边的长度和海拔. 其中有 \(q\) 次询问(强制在线),每次询问给你两个参数 \(v, p\) ,表示在 \(v\) 出发,能开车 ...

随机推荐

  1. Django标签&迭代&循环&过滤

    1.{% for Person in persons %}模板标签的替换,就是利用了基础模板的底层设计,嵌套了其他显示的内容.常见的内容替换标签{% block content %}{%endbloc ...

  2. stream to byte[], byte[] to srting

    byte[] myBinary = new byte[paramFile.Length]; paramFile.Read(myBinary, , (int)paramFile.Length); str ...

  3. Python3 zip() 函数

    描述 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存. 我们可以使用 list() 转换来输出列表. 如果 ...

  4. C#黎明前的黑暗

    学习编程已经很久了,然而技术还停留在远古时代,丝毫没有什么进步的痕迹,平常也就写一些小软件来处理工作上面遇到的一些很繁杂的问题,天生愚笨或许就是说的我. 黎明前的黑暗期,真的太长了,烂烂的文章就像烂烂 ...

  5. [转] 组件库按需加载 借助babel-plugin-import实现

    前段时间一直在基于webpack进行前端资源包的瘦身.在项目中基于路由进行代码分离,http://www.cnblogs.com/legu/p/7251562.html.对于公司内部的组件库,所有内容 ...

  6. 【CF724F】Uniformly Branched Trees

    题意:询问n个点的每个非叶子点度数恰好等于d的不同构的无根树的数目. n≤1000,d≤10n≤1000,d≤10. 题解: 这题真的是一道非常好的题 首先考虑有根树 定义f[i][j][k]表示i个 ...

  7. noip斗地主

    题解: 5分钟看题 25分钟码完 然后调了一下 样例1s??? 好吧我把只出一张牌当成决策了.. 判断了一下前面没有出牌再考虑这个决策(是不是傻逼??) 交上去65 于是愉快的改状压 改到一半的时候想 ...

  8. 一起学Hadoop——使用自定义Partition实现hadoop部分排序

    排序在很多业务场景都要用到,今天本文介绍如何借助于自定义Partition类实现hadoop部分排序.本文还是使用java和python实现排序代码. 1.部分排序. 部分排序就是在每个文件中都是有序 ...

  9. Python_时间复杂度概念

    时间频度:一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)(T代表次数,n代表问题规模) 时间复杂度:呈现时间频度的变化规律,记为T(n)=O(f(n)) 指数时间:一个问题求解所需的执行 ...

  10. ifconf家族命令

    1  ifconfig 命令: ifconfig 命令用来查看和配置网络设备.当网络环境发生改变时可通过此命令对网络进行相应的配置. 查看: ifconfig : 显示正在激活中的网卡 ifconfi ...