NOI2018 归程

  1. 存边的数组拿来干两件事,忘了清空了,其实最好开两个的
  2. dfs 没开 vis 导致不知道为什么出现的绕圈
  3. 倍增的 fa[i][j] 定义的时候前面是 \(2^{i}\) 写着写着记错成后面了
  4. 忘记要递减排序了,跑的最小生成树
  5. 并查集没初始化
  6. 不知道为什么,倍增的 fa 数组单独一块处理会 WA,回来发现是因为只循环到 n,没处理虚点,不过这个时候我已经把它塞到 dfs 里对了
  7. 忘记删输出中间变量
  8. 忘记删 freopen
  9. 并查集忘记路径压缩

因为破防了,特此记录

#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 重构树题硬控我三小时的更多相关文章

  1. [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树)

    [luogu4768] [NOI2018] 归程 (Dijkstra+Kruskal重构树) 题面 题面较长,这里就不贴了 分析 看到不能经过有积水的边,即不能经过边权小于一定值的边,我们想到了kru ...

  2. isaster(Comet OJ - Contest #11D题+kruskal重构树+线段树+倍增)

    目录 题目链接 思路 代码 题目链接 传送门 思路 \(kruskal\)重构树\(+\)线段树\(+\)倍增 代码 #include <set> #include <map> ...

  3. 【BZOJ 3732】 Network Kruskal重构树+倍增LCA

    Kruskal重构树裸题, Sunshine互测的A题就是Kruskal重构树,我通过互测了解到了这个神奇的东西... 理解起来应该没什么难度吧,但是我的Peaks连WA,,, 省选估计要滚粗了TwT ...

  4. 【BZOJ-3545&3551】Peaks&加强版 Kruskal重构树 + 主席树 + DFS序 + 倍增

    3545: [ONTAK2010]Peaks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 321[Submit][Sta ...

  5. kruskal重构树学习笔记

    \(kruskal\) 重构树学习笔记 前言 \(8102IONCC\) 中考到了,本蒟蒻不会,所以学一下. 前置知识 \(kruskal​\) 求最小(大)生成树,树上求 \(lca​\). 算法详 ...

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

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

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

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

  8. BZOJ 4242: 水壶(Kruskal重构树 + Bfs)

    题意 一块 \(h ∗ w\) 的区域,存在障碍.空地.\(n\) 个建筑,从一个建筑到另一个建筑的花费为:路径上最长的连续空地的长度. \(q\) 次询问:从建筑 \(s_i\) 到 \(t_i\) ...

  9. CF1131F Asya And Kittens(Kruskal重构树,启发式合并)

    这题难度1700,我感觉又小了…… 这题虽然没几个人是用kruskal重构树的思想做的,但是我是,所以我就放了个kruskal重构树的标签. 题目链接:CF原网 题目大意:有一个长为 $n$ 的排列, ...

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

    LOJ2718 BZOJ5415 洛谷P4768 Rank3+Rank1无压力 BZOJ最初还不是一道权限题... Update 2019.1.5 UOJ上被hack了....好像是纯一条链的数据过不 ...

随机推荐

  1. python 列表append和 的区别??

    python列表中的合并 python列表中append方法是给列表增加一个元素,而'+='是增加上该符号后边的元素,类似于extend方法 不知道对错,先记下来.我学的append方法是在列表最后追 ...

  2. Javascript 转Date对象为字符串实现函数

    转Date对象为字符串实现函数 function formatDate(time, format = "Y-MM-dd HH:mm:ss") { /** 格式化字符说明 Y 年 四 ...

  3. 安装docker并部署java项目

    docker部署springboot项目(详细教程)_使用docker部署springboot项目_流星007的博客-CSDN博客 ps:以下是部署到linux 服务器中的 案例(与chatgpt的对 ...

  4. Jmeter JDBC连接配置

    JDBC连接配置(JDBC Connection Configuration),用于创建数据库连接,后续可对数据库进行增删查等操作.和组件[JDBC请求(JDBC Request)]搭配使用 组件路径 ...

  5. 【杂谈】JPA乐观锁改悲观锁遇到的一些问题与思考

    背景 接过一个外包的项目,该项目使用JPA作为ORM. 项目中有多个entity带有@version字段 当并发高的时候经常报乐观锁错误OptimisticLocingFailureException ...

  6. 【Java】 Springboot+Vue 大文件断点续传

    同事在重构老系统的项目时用到了这种大文件上传 第一篇文章是简书的这个: https://www.jianshu.com/p/b59d7dee15a6 是夏大佬写的vue-uploader组件: htt ...

  7. 【JavaScript】无框架翻页处理

    这个业务太复杂了 输入框的东西要用接口查出来,居然不是用户手动输入 然后我就要做一个翻页的查询列表: <div form id="troublePartSearch" sty ...

  8. 【Spring】07 后续的学习补充 vol1

    控制反转Inverse Of Control的演变: 在之前的原生Javaweb项目的问题: 我们三层架构每一层之间的联系是这样的: 由GradeDao接口指向GradeDaoImpl 再由Grade ...

  9. Jax框架的性能分析——性能分析可视化

    官方文档: https://jax.readthedocs.io/en/latest/profiling.html 将jax代码的性能文件写入到文件夹中,并给出上传第三方网站的链接生成(https:/ ...

  10. git 如何删除一个文件名为nul的文件

    前提 当我发现存在一个nul的文件,手动删除/移动它,都会提示ms-dos功能无效或文件过大.想一想这个nul应该是某个保留字,所以普通的方式不能删除 解决方案 https://stackoverfl ...