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;
}

转载于:https://www.cnblogs.com/SovietPower/p/9334873.html

LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)相关推荐

  1. P4768 [NOI2018] 归程 Kruskal重构树 + 倍增 + 最短路

    传送门 文章目录 题意: 思路: 题意: 给你一个联通无向图,每条边有一个长度lll和海拔aaa,当海拔≤\le≤水位线的时候,说明这个道有积水.在起始点有一辆车,车可以走没有积水的路,下车后可以走有 ...

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

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

  3. 洛谷 - P4768 [NOI2018]归程(Kruskal重构树+树上倍增+最短路)

    题目链接:点击查看 题目大意:去原网址看吧 题目分析:因为是在刷克鲁斯卡尔重构树的题目,所以稍微思考一下就能想出解法了,首先如果水位线固定了,剩下的边组成的最小生成树也是一定的,此时同一个连通块内的点 ...

  4. LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)

    LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...

  5. NOI 2018 归程 (Kruskal重构树)

    题目大意:太长了,略 Kruskal重构树,很神奇的一个算法吧 如果两个并查集被某种条件合并,那么这个条件作为一个新的节点连接两个并查集 那么在接下来的提问中,如果某个点合法,它的所有子节点也都合法, ...

  6. AGC002(D~F)【Kruskal重构树,博弈论,dp】

    正题 AT1998 [AGC002D] Stamp Rally[Kruskal重构树,倍增] https://www.luogu.com.cn/problem/AT1998 题目大意 给出nnn个点m ...

  7. [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

    [NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...

  8. NOI2018 Day1 归程(Kruskal重构树)

    目录 NOI2018 Day1 return 题解 AC代码: NOI2018 Day1 return 题解 作为NOI Day1 的T1,这道题目还是比较清真的(虽然自己在同步赛的时候只打了70分的 ...

  9. NOI2018 D1T1 洛谷P4768 归程 (Kruskal重构树)

    题目传送门 实际上是一个最短路问题,但加上了海拔这个条件限制,要在海拔<水位线p中找最短路. 这里使用Kruskal重构树,将其按海拔建成小根堆,我们就可以在树中用倍增找出他不得不下车的点:树中 ...

最新文章

  1. [转] 中国的车祸为什么多?一个”海归”的亲身体验(转)
  2. HTTP错误404.3-Not Found
  3. 什么是设计模式(Design Patterns)
  4. c语言学习之基础知识点介绍(十):数组
  5. 自适应滤波:最小均方误差滤波器(LMS、NLMS)
  6. Django报错SocialApp matching query does not exist以及Django的SITE_ID = 1的含义
  7. 史上最丧心病狂的商品定价套路:如何从数学角度,榨干你身上的每一分钱
  8. 一位36岁女教师关于教职、学术、幸福及正确道路的思考
  9. [041] 微信公众帐号开发教程第17篇-应用实例之智能翻译
  10. 波士顿动力新视频:上岗工作机器狗,巡查工地一丝不苟
  11. MFC加入mysql后编译成功,在自己电脑上成功运行,当打包发送到其他电脑上报错, 缺少libcrypto-1_1-x64.dll以及缺少libssl-1_1-x64.dll问题解决方案,完美亲测
  12. 最具有中国特色的脑筋急转弯
  13. c语言timer linux 回调函数_SetTimer 与 回调函数
  14. 大一大学计算机期末考试题库,大学计算机基础 大一 考试必备题库
  15. HTML网页设计制作大作业 - 绿色环境保护HTML5网站模板(4个页面)
  16. 企业级docker仓库Harbor在kubernetes上搭建使用
  17. 本地telnet使用
  18. 最新html取消dynsrc属性无效,Html属性标签 - osc_5aj0jo70的个人空间 - OSCHINA - 中文开源技术交流社区...
  19. 详解边缘计算系统逻辑架构:云、边、端协同
  20. Python编程与其他编程语言相比有何优势?

热门文章

  1. Linux C 函数练习
  2. Python中的元类及元类实现的单例模式
  3. python中使用sys模板和logging模块获取行号和函数名的方法
  4. c#获取当前应用程序所在路径
  5. React开发(216):ant dedign 弹窗销毁后再打开,原来的值仍存在,如何销毁弹窗内容?
  6. 重学java基础第二十二课:IDEA安装
  7. 前端学习(3313):redux的基本操作
  8. 前端学习(3271):js中this的使用
  9. [vue] 你有使用过JSX吗?说说你对JSX的理解
  10. [css] css如何消除字体的锯齿?