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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/413708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[css] 举例说说你对white-space属性的理解

[css] 举例说说你对white-space属性的理解 值 说明 normal 默认。空白会被浏览器忽略。 pre 空白会被浏览器保留。其行为方式类似 HTML 中的 <pre> 标签。 nowrap 文本不会换行&#xff0c;文本会在在同一行上继续&#xff0c;直到遇到 <br> 标签为止。 pre-w…

微信小程序复制到剪切板及换行问题

wxml <textarea type"text" v-model"copyContent" placeholder"请输入内容" style""/> <button type"default" click"copy">复制内容</button> data中声明变量 data(){return{copyContent: …

mysql查询某天是本年第几周

SELECT WEEK(date_add(2012-12-31,interval 6 day),2);转载于:https://www.cnblogs.com/remember-forget/p/9334878.html

[css] 为什么伪类的content不能被选中?

[css] 第432天 为什么伪类的content不能被选中&#xff1f; 伪类不是真正的DOM,无DOM相关的属性和方法个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

解决Vue跳转到当前路由报错问题

一、问题背景 官网首页Herder鼠标悬浮有很多二级页面&#xff0c;点击二级页面会进行跳转&#xff0c;当我已经在一个二级页面时&#xff0c;点击顶部导航中当前二级页面的其中一个状态&#xff08;其实可以用三级页面&#xff0c;但是因为内容不多&#xff0c;我将一些内容写…

清除Pycharm设置的方法

Mac 按需运行下面的 rm 删除命令 # Configuration rm -rf ~/Library/Preferences/PyCharm* # Caches rm -rf ~/Library/Caches/PyCharm* # Plugins rm -rf ~/Library/Application Support/PyCharm* # Logs rm -rf ~/Library/Logs/PyCharm* Windows 找到下面的路径&#xff0c;然…

[css] 如何取消页面中选中的文字?

[css] 如何取消页面中选中的文字&#xff1f; user-select: none; /* browser-specific values */ -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none;个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一…

GridView直接更新数据,kartik\grid\EditableColumn用法 [ 2.0 版本 ]

GridView直接更新数据&#xff0c;kartik\grid\EditableColumn用法 [ 2.0 版本 ] 视图的_columns.php文件&#xff0c;这里用到的是crudajax生成的 <?php use yii\helpers\Url; use common\models\ProductCategory; return [ [ class > kartik\grid\SerialColumn, width…

[css] 什么是关键帧动画?

[css] 什么是关键帧动画&#xff1f; 表示关键状态的帧动画叫做关键帧动画。 所谓关键帧动画&#xff0c;就是给需要动画效果的属性&#xff0c;准备一组与时间相关的值&#xff0c;这些值都是在动画序列中比较关键的帧中提取出来的&#xff0c;而其他时间帧中的值&#xff0c…

python webdriver firefox 登录126邮箱,先添加联系人,然后进入首页发送邮件,带附件。...

代码&#xff1a;#encodingutf-8from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_con…

[vue] 你是从vue哪个版本开始用的?你知道1.x和2.x有什么区别吗?

[vue] 你是从vue哪个版本开始用的&#xff1f;你知道1.x和2.x有什么区别吗&#xff1f; 像1.0与2.0&#xff0c;我只知道一点-。- 1、 2.0生命生命周期变化感觉变得更加语义化一点&#xff08;有规律可寻&#xff0c;更好记了&#xff09;&#xff0c;而且增加了beforeUpdate、…

[vue] 你知道vue中key的原理吗?说说你对它的理解

[vue] 你知道vue中key的原理吗&#xff1f;说说你对它的理解 key的作用主要是为了高效的更新虚拟DOM; 如果没有唯一的key, 数据更新时, 相同节点更新前后无法准确一一对应起来,会导致更新效率降低; 当页面的数据发生变化时&#xff0c;Diff算法只会比较同一层级的节点&#xf…

Java就应该这样学pdf

下载地址&#xff1a;网盘下载 《其实你应该这样学Java(附盘)》&#xff0c;本书分为3篇。第1篇是Java入门&#xff0c;简单介绍了Java开发环境、类型和运算、选择语句、循环语句、跳转语句、数组的基本应用&#xff1b;第2篇是面向对象的基础知识&#xff0c;包含类、继承以及…

[vue] vue中怎么重置data?

[vue] vue中怎么重置data&#xff1f; 初始状态下设置data数据的默认值&#xff0c;重置时直接bject.assign(this.$data, this.$options.data())说明&#xff1a; this.$data获取当前状态下的data this.$options.data()获取该组件初始状态下的data(即初始默认值) 如果只想修改…

redis nginx session tomcat

Redis解决session共享 http://lyl-zsu.iteye.com/blog/2408292 http://zx10103326.iteye.com/blog/2244195 https://www.dssz.com/3179792.html 注意 要下载 三个 Redis 存放 session的三个包 视频学习地址在&#xff1a; 分布式环境下session跨域共享原理-咕泡学院出品 https:…

[vue-cli]怎么使用vue-cli3创建一个项目?

[vue-cli]怎么使用vue-cli3创建一个项目&#xff1f; 直接 vue create 项目名个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

[vue-cli]不用vue-cli,你自己有搭建过vue的开发环境吗?流程是什么?

[vue-cli]不用vue-cli&#xff0c;你自己有搭建过vue的开发环境吗&#xff1f;流程是什么&#xff1f; 基本概念 首先先了解先webpack的基本概念&#xff0c;webpack属于一个构建工具&#xff0c;主要有mode、entry、output、loader、plugin这几部分组成。 目标 本文会带你实现…

伪类选择器的用途

伪类选择器的用途 1.做鼠标移入、移出效果切换 .a {display: inline-block;width: 70px;height: 20px;border: 2px solid #e01222;line-height: 20px;text-align: center;color: #e01222; } a:hover {background-color: #e01222;color: #fff;} 2.画三角形 .triangle:before…

[vue-cli]vue-cli默认是单页面的,那要弄成多页面该怎么办呢

[vue-cli]vue-cli默认是单页面的&#xff0c;那要弄成多页面该怎么办呢 创建多个app&#xff1f; app new Vue({}) app2 new Vue({})个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣…

html画特殊图形(待修改)

1.画圆 <!doctype html> <html><head><style>*{margin:0;padding:0;}.box{margin:50px auto;width:100px;height:100px;border-radius:50%;background:pink;}</style></head> <body><div class"box"></div> …