致敬传奇 Kruskal 重构树题硬控我三小时
NOI2018 归程
- 存边的数组拿来干两件事,忘了清空了,其实最好开两个的
- dfs 没开 vis 导致不知道为什么出现的绕圈
- 倍增的 fa[i][j] 定义的时候前面是 \(2^{i}\) 写着写着记错成后面了
- 忘记要递减排序了,跑的最小生成树
- 并查集没初始化
- 不知道为什么,倍增的 fa 数组单独一块处理会 WA,回来发现是因为只循环到 n,没处理虚点,不过这个时候我已经把它塞到 dfs 里对了
- 忘记删输出中间变量
- 忘记删 freopen
- 并查集忘记路径压缩
因为破防了,特此记录
#include<bits/stdc++.h>
using namespace std;
const int N=800001;
int n,m;
struct edge{
int to,w;
};
vector<edge>e[N];
struct aedge{
int x,y,l;
bool operator <(const aedge &A)const{
return l>A.l;
}
}E[N];
struct node{
int id,w;
bool operator <(const node &A)const{
return w>A.w;
}
};
int fa[N][21],mn[N],val[N];
namespace dsu{
int fa[N];
void clear(int n){
for(int i=1;i<=n;++i){
fa[i]=i;
}
}
int find(int id){
// cout<<"find "<<id<<endl;
if(id==fa[id]) return id;
fa[id]=find(fa[id]);
return fa[id];
}
}
namespace DIJKSTRA{
int vis[N],dis[N];
priority_queue<node>q;
void dij(){
memset(vis,0,sizeof vis);
memset(dis,0x3f,sizeof dis);
vis[1]=1;dis[1]=0;
q.push({1,dis[1]});
while(!q.empty()){
node u=q.top();q.pop();
for(edge i:e[u.id]){
if(dis[i.to]>dis[u.id]+i.w){
dis[i.to]=dis[u.id]+i.w;
q.push({i.to,dis[i.to]});
}
}
}
}
}
bool vvis[N];
void dfs(int now,int last){
if(vvis[now]) return;
vvis[now]=true;
// cout<<"dfs "<<now<<" "<<last<<endl;
// cout<<"dfs "<<now<<" "<<last<<endl;
fa[now][0]=last;
mn[now]=DIJKSTRA::dis[now];
// cout<<now<<" "<<mn[now]<<endl;
for(int i=1;i<=20;++i){
fa[now][i]=fa[fa[now][i-1]][i-1];
}
for(edge i:e[now]){
if(i.to!=last){
dfs(i.to,now);
mn[now]=min(mn[now],mn[i.to]);
}
}
}
int cnt;
int main(){
// freopen("in.in","r",stdin);
// freopen("1.out","w",stdout);
int cases;scanf("%d",&cases);while(cases--){
scanf("%d %d",&n,&m);
memset(mn,0,sizeof mn);
memset(fa,0,sizeof fa);
for(int i=1;i<=N;++i){
e[i].clear();
}
for(int i=1;i<=m;++i){
int x,y,l,a;scanf("%d %d %d %d",&x,&y,&l,&a);
E[i]={x,y,a};
e[x].push_back({y,l});
e[y].push_back({x,l});
// cout<<"add "<<x<<" "<<y<<endl;
// cout<<"add "<<y<<" "<<x<<endl;
}
// cout<<"aa "<<endl;
DIJKSTRA::dij();
// cout<<"aa "<<endl;
sort(E+1,E+m+1);
// cout<<"aa "<<endl;
dsu::clear(N);
for(int i=1;i<=N;++i){
e[i].clear();
}
// cout<<"aa "<<endl;
int now=n;
for(int i=1;i<=m;++i){
// cout<<"aa "<<i<<endl;
// cout<<E[i].x<<" "<<E[i].y<<endl;
int x=E[i].x,y=E[i].y,w=E[i].l;
int fx=dsu::find(x);
// cout<<"fx"<<endl;
int fy=dsu::find(y);
// cout<<"fy"<<endl;
if(fx^fy){
val[++now]=w;
// cout<<"你他妈到底在哪RE了"<<endl;
dsu::fa[fx]=dsu::fa[fy]=dsu::fa[now]=now;
// cout<<"6"<<endl;
e[now].push_back({fx,1});
// cout<<"6"<<endl;
e[now].push_back({fy,1});
// cout<<"add "<<now<<" "<<fx<<endl;
// cout<<"add "<<now<<" "<<fy<<endl;
// cout<<"6"<<endl;
}
}
// cout<<"dfs"<<endl;
memset(vvis,false,sizeof vvis);
dfs(now,0);
int last=0;
// cout<<"54"<<endl;
int q,k,s;scanf("%d %d %d",&q,&k,&s);
for(int i=1;i<=q;++i){
int x,y,v,p;
scanf("%d %d",&x,&y);
v=(x+k*last-1)%n+1;
p=(y+k*last)%(s+1);
for(int j=20;j>=0;--j){
if(fa[v][j] and val[fa[v][j]]>p) v=fa[v][j];
}
// cout<<"find "<<v<<endl;
printf("%d\n",last=mn[v]);
}
}
}
致敬传奇 Kruskal 重构树题硬控我三小时的更多相关文章
- [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)
[luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kru ...
- isaster(Comet OJ - Contest #11D题+kruskal重构树+线段树+倍增)
目录 题目链接 思路 代码 题目链接 传送门 思路 \(kruskal\)重构树\(+\)线段树\(+\)倍增 代码 #include <set> #include <map> ...
- 【BZOJ 3732】 Network Kruskal重构树+倍增LCA
Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT ...
- 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 321[Submit][Sta ...
- kruskal重构树学习笔记
\(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal\) 求最小(大)生成树,树上求 \(lca\). 算法详 ...
- LOJ.2865.[IOI2018]狼人(Kruskal重构树 主席树)
LOJ 洛谷 这题不就是Peaks(加强版)或者归程么..这算是\(IOI2018\)撞上\(NOI2018\)的题了? \(Kruskal\)重构树(具体是所有点按从小到大/从大到小的顺序,依次加入 ...
- 洛谷P4768 [NOI2018]归程(Kruskal重构树)
题意 直接看题目吧,不好描述 Sol 考虑暴力做法 首先预处理出从$1$到每个节点的最短路, 对于每次询问,暴力的从这个点BFS,从能走到的点里面取$min$ 考虑如何优化,这里要用到Kruskal重 ...
- BZOJ 4242: 水壶(Kruskal重构树 + Bfs)
题意 一块 \(h ∗ w\) 的区域,存在障碍.空地.\(n\) 个建筑,从一个建筑到另一个建筑的花费为:路径上最长的连续空地的长度. \(q\) 次询问:从建筑 \(s_i\) 到 \(t_i\) ...
- CF1131F Asya And Kittens(Kruskal重构树,启发式合并)
这题难度1700,我感觉又小了…… 这题虽然没几个人是用kruskal重构树的思想做的,但是我是,所以我就放了个kruskal重构树的标签. 题目链接:CF原网 题目大意:有一个长为 $n$ 的排列, ...
- LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)
LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...
随机推荐
- Jmeter函数助手30-groovy
groovy函数用于脚本执行. 表达式评估:填入Apache Groovy脚本(不是文件名).本身包含逗号的参数值应根据需要进行转义'\,' 存储结果的变量名(可选) 1.引用变量进行截取字符处理 $ ...
- 第九讲: MySQL为什么有时候会选错索引?
第九讲: MySQL为什么有时候会选错索引? 前面我们介绍过索引,你已经知道了在 MySQL 中一张表其实是可以支持多个索引的. 但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引.也 ...
- 【Java】删除项目中多余的SVG图片资源
在DB库的菜单表,每个菜单会存放对应的svg图片名称,用于菜单渲染 在页面中的渲染: 在项目的目录的存放位置: 需求是这个目录还存放了很多不需要的svg图片,需要把他们删除掉 数量有七八十张,人肉手删 ...
- 【SpringBoot】日志在项目中的应用
日志的目的: 为了方便日后的运维,快速定位BUG,错误信息等等 日志算是一个救命稻草 pom.xml需要的依赖: <?xml version="1.0" encoding=& ...
- 【Windows】Win10 20H2版本 管理员身份问题
问题描述: 从之前的1909版本升级过来的,在一开始就是管理员身份,升级之后还是管理员身份没错 但是打开一些软件又会开始提示是否安全,还有C盘访问权限警告. 解决办法: 参考方案地址 http://w ...
- 【Vue】13 VueRouter Part3 路由守卫
单页应用中,只存在一个HTML文件,网页的标签,是通过title标签显示的,我们在单页应用中如何修改? JS操作: window.document.title = "标签名称" 也 ...
- 如何使用H100打游戏——这是史上最快GPU!我们测了四张H100!价值120万元!
资料: 这是史上最快GPU!我们测了四张H100!价值120万元! 对显卡H100的测评视频.
- 【转载】 miniImageNet数据集介绍
版权声明:本文为CSDN博主「miguemath」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/wangkai ...
- git No url found for submodule path 'xxxxx' in .gitmodules
删除之前的子模块记录 rm -rf git rm --cached 然后加进去 git submodule add
- a标签设置下载设置文件名,并且设置无效的解决方法
设置 a 标签的 download属性,可以重置 文件名.如下代码,文件名重置为 file.xlsx. <a href='http://192.168.1.1/abcd.xlsx' downlo ...