[BZOJ] 5415: [Noi2018]归程
在做Kruskal求最小生成树时,假设要通过边权\(w\)的边合并子树\(x\)和\(y\),我们新建一个方点,把两个子树接到这个方点上,并将方点的点权赋为\(w\),最终形成的二叉树就是\(Kruskal\)重构树。
这样的二叉树,是一个二叉堆,满足一个方点为根的子树内,所有方点点权都小于该点点权
统计原图上两点之间最大值的最小值时,答案就是这两点\(LCA\)的点权
\(Kruskal\)重构树很好地把一维限制放到了子树内,方便统计
对于这个题,我们以海拔为边权建一颗最大生成树,那么对应的\(Kruskal\)重构树就是一个小根堆,设一个方点\(x\)的点权为\(w\),那么以\(x\)为根的子树内,任何一对点之间经过的海拔都大于等于\(w\),于是我们只需要树上倍增找到最靠上的一个点,我们考虑该点为根的子树内的点,就取消了海拔的限制,那么只需要找\(l\)意义上最靠近1点的一个点即可。
复杂度\(O(nlogn)\)
多组数据一定要注意清空,考虑每个变量,每个数组,认真考虑!!!!!!!!!!
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
inline int rd(){
int ret=0,f=1;char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
while(isdigit(c))ret=ret*10+c-'0',c=getchar();
return ret*f;
}
const int MAXN = 800005;
int tot;
inline int newnode(){return ++tot;}
struct Undirected_Edge{
int x,y,w;
bool operator<(const Undirected_Edge &rhs)const {
return w>rhs.w;
}
}ue[MAXN];
struct Edge{
int ecnt,head[MAXN],nxt[MAXN],to[MAXN],h[MAXN],l[MAXN];
Edge(){ecnt=1;}
void clear(){
ecnt=1;
memset(head,0,sizeof(head));
}
void add(int x,int y,int _l=0,int _h=0){
nxt[++ecnt] = head[x];
to[ecnt] = y;
h[ecnt] = _h;
l[ecnt] = _l;
head[x] = ecnt;
}
}e,t;
int n,m;
struct Uno{
int fa[MAXN];
void init(int x){for(int i=1;i<=x;i++)fa[i]=i;}
int fnd(int x){return x==fa[x]?x:fa[x]=fnd(fa[x]);}
void cat(int x,int y){x=fnd(x);y=fnd(y);if(x==y)return;fa[x]=y;}
}U;
struct Node{
int id,v;
Node(int _id=0,int _v=0){id=_id;v=_v;}
bool operator <(const Node &rhs)const{return v>rhs.v;}
}top;
priority_queue<Node> Q;
int vis[MAXN],dis[MAXN];
void dij(){
Q.push(Node(1,0));dis[1]=0;
while(!Q.empty()){
top=Q.top();Q.pop();
int mnid=top.id,mn=top.v;
if(vis[mnid]||mn!=dis[mnid])continue;
vis[mnid]=1;
for(int i=e.head[mnid];i;i=e.nxt[i]){
int v=e.to[i];
if(dis[v]<=mn+e.l[i])continue;
dis[v]=mn+e.l[i];
Q.push(Node(v,dis[v]));
}
}
}
int low[MAXN],val[MAXN],f[MAXN][32];
void init(){
U.init(n<<1);tot=n;
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
memset(low,0x7f,sizeof(low));
memset(val,0,sizeof(val));
memset(f,0,sizeof(f));
e.clear();t.clear();
}
void dfs(int x,int pre){
f[x][0]=pre;low[x]=dis[x];
for(int i=t.head[x];i;i=t.nxt[i]){
int v=t.to[i];
if(v==pre)continue;
dfs(v,x);low[x]=min(low[x],low[v]);
}
}
int q,k,s;
int lastans;
void solve(){
lastans=0;//fff
int x,y,u,v,l,h,cur;
for(int i=1;i<=m;i++){
x=rd();y=rd();l=rd();h=rd();
e.add(x,y,l,h);e.add(y,x,l,h);
ue[i].x = x;ue[i].y = y;ue[i].w = h;
}
dij();
sort(ue+1,ue+1+m);
int Edge_cnt=0;
for(int i=1;i<=m;i++){
x=ue[i].x,y=ue[i].y,h=ue[i].w;
u=U.fnd(x);v=U.fnd(y);
if(u==v)continue;
cur=newnode();Edge_cnt++;
U.cat(u,cur);U.cat(v,cur);
t.add(u,cur);t.add(cur,u);
t.add(v,cur);t.add(cur,v);
val[cur]=h;
if(Edge_cnt==n-1)break;
}
int rt=U.fnd(1);
dfs(rt,rt);
for(int j=1;(1<<j)<=tot;j++){
for(int i=1;i<=tot;i++){
f[i][j]=f[f[i][j-1]][j-1];
}
}
q=rd();k=rd();s=rd();
for(int i=1;i<=q;i++){
x=rd();y=rd();
u=(x+k*lastans-1)%n+1;
v=(y+k*lastans)%(s+1);
for(int i=30;i>=0;i--){
if(val[f[u][i]]<=v)continue;
u=f[u][i];
}
printf("%d\n",low[u]);
lastans=low[u];
}
}
int T;
signed main(){
T=rd();
while(T--){
n=rd();m=rd();
init();
solve();
}
return 0;
}
[BZOJ] 5415: [Noi2018]归程的更多相关文章
- BZOJ 5415: [Noi2018]归程(kruskal重构树)
解题思路 \(NOI2018\)的\(Day1\) \(T1\),当时打网络赛的时候不会做.学了一下\(kruskal\)重构树后发现问题迎刃而解了.根据\(kruskal\)的性质,如果要找从\(u ...
- 【刷题】BZOJ 5415 [Noi2018]归程
www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf Solution 考试的时候打的可持久化并查集,没调出来QAQ 后面知道了kruskal重构树这个东西 ...
- [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程
[LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程 题意 给定一张无向图, 每条边有一个距离和一个高度. 再给定 \(q\) 组可能在线的询问, 每组询问给定一个点 ...
- [NOI2018]归程 kruskal重构树
[NOI2018]归程 LG传送门 kruskal重构树模板题. 另一篇文章里有关于kruskal重构树更详细的介绍和更板子的题目. 题意懒得说了,这题的关键在于快速找出从查询的点出发能到达的点(即经 ...
- [洛谷P4768] [NOI2018]归程 (kruskal重构树模板讲解)
洛谷题目链接:[NOI2018]归程 因为题面复制过来有点炸格式,所以要看题目就点一下链接吧\(qwq\) 题意: 在一张无向图上,每一条边都有一个长度和海拔高度,小\(Y\)的家在\(1\)节点,并 ...
- NOI2018 D1T1 [NOI2018]归程 解题报告
P4768 [NOI2018]归程 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 \(n\) 个节点.\(m\) 条边的无向连通图(节点的编号从 \ ...
- BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增+最短路
BZOJ_5415_[Noi2018]归程_kruscal重构树+倍增 Description www.lydsy.com/JudgeOnline/upload/noi2018day1.pdf 好久不 ...
- 题解 NOI2018 归程
题解 NOI2018 归程 题意 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l, ...
- [NOI2018]归程(kruscal重构树)
[NOI2018]归程 题面太长辣,戳这里 模拟赛上写了一个spfa (关于spfa,它已经死了),然后一个st表水完暴力跑路.考后说是Kruscal重构树或者可持久化并查集???这都是些什么东西.不 ...
随机推荐
- BZOJ 1069: [SCOI2007]最大土地面积(旋转卡壳)
题目链接~ 1069: [SCOI2007]最大土地面积 思路很简单,极角排序求完凸包后,在凸包上枚举对角线,然后两边分别来两个点旋转卡壳一下,搞定! 不过计算几何的题目就是这样,程序中间的处理还是比 ...
- java编写jmeter压测脚本
目前项目中接触的比较多的是接口测试,功能测个差不多后会对部分接口进行压测,采用的是java编写脚本,导入jmeter进行压测. 使用到的jmeter的相关包 写一个测试类,继承AbstractJava ...
- ELK系列(1) - Elasticsearch + Logstash + Kibana + Log4j2快速入门与搭建用例
前言 最近公司分了个ELK相关的任务给我,在一边学习一边工作之余,总结下这些天来的学习历程和踩坑记录. 首先介绍下使用ELK的项目背景:在项目的数据库里有个表用来存储消息队列的消费日志,这些日志用于开 ...
- 基于角色权限管理:rbac设计分析以及具体细节
权限管理---设计分析以及具体细节 说起权限我们大家都知道,不一样的角色会有不一样的权限. 比如就像学生管理系统一样,管理员,老师,学生之间的权限都是不一样的,那么展示的页面也是不一样的. 所以,我们 ...
- [NWPU2016][寒假作业][正常版第三组]R&&HDU1240
题意是有个三维的地图,从起点到终点的最短路径.用bfs做,不过这个题坑的地方在于,开三维数组你要搞清楚纬度的关系.a[i][j][h] i是层,j是行,h是列.然后坐标呢,又是列,行,层,所以如果要用 ...
- Hive进阶_Hive数据查询
简单查询和fetch task 简单查询: 简单查询的 fetch task 功能,从HDFS拉取,不用map reduce. 前两种配置,当前session有效.修改hive-site.xml永 ...
- 1550: Simple String 最大流解法
http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1550 很久以前做的一题,当时队友用最大流做,现在我也是 这个转化为二分图多重匹配,就是一样的意 ...
- 重置 linux系统后要配置的基本组件操作
1.安装jdk https://www.cnblogs.com/shihaiming/p/5809553.html 2.安装mysql 3.安装tomcat
- zk实现服务选举
非公平选举算法1)首先通过zk创建一个 /server 的PERSISTENT节点 2)多台机器同时创建 /server/leader EPHEMERAL子节点 3)子节点只能创建一个,后创建的会失败 ...
- HDP和包围曝光
摄影笔记:http://mp.weixin.qq.com/s/6xgTtAcLAPkWY9FjqrfvtA 我们通过观察直方图曝光,尽量要直方图两边的纯黑和纯白区域不要有信息,就是亮的地方不死白,暗的 ...