解题:NOI 2018 归程
清新友好的题目
跑一个最短路,然后对海拔建Kruskal重构树,从最后接上去的边(最低的一个)开始DFS一下处理子树里路程的最小值。
询问是每次在重构树上倍增找到深度最浅的海拔高于当天水位线的节点,其子树内的点必定可以通过乘车互相到达。
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,X=,inf=2e9;
struct a
{
int x,y,s;
}mst[N];
struct b{int node,dist;};
bool operator < (b x,b y)
{
return x.dist>y.dist;
}
priority_queue<b> hp;
int p[N],noww[M],goal[M],val[M];
int P[N],Noww[M],Goal[M],mul[N][X];
int vis[N],dis[N],aset[N],elev[N],mind[N];
int n,m,T,Q,S,K,t1,t2,t3,t4,cnt,Cnt,tot,ans;
bool cmp(a x,a y)
{
return x.s>y.s;
}
int Finda(int x)
{
return x==aset[x]?x:aset[x]=Finda(aset[x]);
}
void Link(int f,int t,int v)
{
noww[++cnt]=p[f],p[f]=cnt;
goal[cnt]=t,val[cnt]=v;
noww[++cnt]=p[t],p[t]=cnt;
goal[cnt]=f,val[cnt]=v;
}
void Linka(int f,int t)
{
Noww[++Cnt]=P[f];
Goal[Cnt]=t,P[f]=Cnt;
Noww[++Cnt]=P[t];
Goal[Cnt]=f,P[t]=Cnt;
}
void Init()
{
memset(p,,sizeof p);
memset(P,,sizeof P);
memset(mul,,sizeof mul);
memset(vis,,sizeof vis);
memset(dis,0x3f,sizeof dis);
for(int i=;i<=n;i++) aset[i]=i;
cnt=Cnt=ans=,tot=n,dis[]=,hp.push((b){,});
}
void Dijkstra()
{
while(!hp.empty())
{
b tt=hp.top(); hp.pop(); int tn=tt.node;
if(vis[tn]) continue; vis[tn]=true;
for(int i=p[tn];i;i=noww[i])
if(dis[goal[i]]>dis[tn]+val[i])
{
dis[goal[i]]=dis[tn]+val[i];
hp.push((b){goal[i],dis[goal[i]]});
}
}
}
void DFS(int nde,int fth)
{
mul[nde][]=fth;
for(int i=;mul[nde][i-];i++)
mul[nde][i]=mul[mul[nde][i-]][i-];
mind[nde]=(nde<=n)?dis[nde]:inf;
for(int i=P[nde];i;i=Noww[i])
if(Goal[i]!=fth)
{
DFS(Goal[i],nde);
if(mind[Goal[i]]<mind[nde])
mind[nde]=mind[Goal[i]];
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m),Init();
for(int i=;i<=m;i++)
{
scanf("%d%d%d%d",&t1,&t2,&t3,&t4);
mst[i]=(a){t1,t2,t4},Link(t1,t2,t3);
}
Dijkstra(),sort(mst+,mst++m,cmp);
for(int i=;i<=m;i++)
{
int tx=Finda(mst[i].x),ty=Finda(mst[i].y),ts=mst[i].s;
if(tx!=ty)
{
elev[++tot]=ts,aset[tot]=aset[tx]=aset[ty]=tot;
Linka(tx,tot),Linka(ty,tot);
}
}
DFS(tot,),scanf("%d%d%d",&Q,&K,&S);
while(Q--)
{
scanf("%d%d",&t1,&t2);
t1=(t1+K*ans-)%n+,t2=(t2+K*ans)%(S+);
for(int i=;~i;i--)
if(elev[mul[t1][i]]>t2) t1=mul[t1][i];
printf("%d\n",ans=mind[t1]);
}
}
return ;
}
解题:NOI 2018 归程的更多相关文章
- [LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程
[LOJ 2718][UOJ 393][BZOJ 5415][NOI 2018]归程 题意 给定一张无向图, 每条边有一个距离和一个高度. 再给定 \(q\) 组可能在线的询问, 每组询问给定一个点 ...
- [NOI 2018] 归程
Description 传送门 Solution 65分做法 先求出每个点到\(1\)号点的最短路,记为\(d[i]\).然后按照海拔从大到小依次加边,并查集维护每个连通块中\(d[i]\)的最小值, ...
- NOI 2018 归程 (Kruskal重构树)
题目大意:太长了,略 Kruskal重构树,很神奇的一个算法吧 如果两个并查集被某种条件合并,那么这个条件作为一个新的节点连接两个并查集 那么在接下来的提问中,如果某个点合法,它的所有子节点也都合法, ...
- [LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字
[LOJ 2720][BZOJ 5417][UOJ 395][NOI 2018]你的名字 题意 给定一个大串 \(S\) 以及 \(q\) 次询问, 每次询问给定一个串 \(T\) 和区间 \([l, ...
- NOI 2018 酱油记
转眼离 NOI 2018 已经过了一个星期了,退役的我还是随便来水水吧. 语法.错字之类的可能会很多,但是我也不拘这点小节了. 恭喜 yww, zjt, sk 进队,zwl, myh au , yay ...
- [LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士
[LOJ 2721][UOJ 396][BZOJ 5418][NOI 2018]屠龙勇士 题意 题面好啰嗦啊直接粘LOJ题面好了 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照 ...
- NOI Day1T1归程(Kruskal重构树+Dijkstra)
NOI Day1T1归程(Kruskal重构树+Dijkstra) 题目 洛谷题目传送门 题解 其实我不想写......,所以...... 挖个坑......我以后一定会补的 luogu的题解讲的还是 ...
- 【NOI 2018】归程(Kruskal重构树)
题面在这里就不放了. 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信 ...
- 「NOI 2018」归程「Kruskal 重构树」
题解 Kruskal重构树:每次一条边连接两个集合,建一个新点,点权为该边边权:把这两个集合的根连向新点. 性质:(如果求的是最大生成树)叶子结点是图中实际结点:叶子到根路径上点权递减:两点间lca的 ...
随机推荐
- 20155213免考项目——bof进阶及简易的HIDAttack
20155213免考项目--bof进阶及简易的HIDAttack 目录 序 任务一:构造Shellcode(64位) 任务二:64位Shellcode的注入 任务三:32位及64位bof攻击(开启堆栈 ...
- 20155339 Exp4 恶意代码分析
20155339 Exp4 恶意代码分析 实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控 ...
- React笔记-事件注册
事件机制 本系列以React v16.8.3为基础进行源码分析 React事件主要分为两部分: 事件注册与事件分发.下面先从事件注册说起. 事件注册 假设我们的程序如下: <!DOCTYPE h ...
- 如何使用URLOS进行docker应用开发
使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完 ...
- 团队作业Week6:规格说明书编写
(1)请分析你们团队项目的典型用户和场景,并写一个团队博客发布你们团队项目的功能规格说明书. (2)再写一个博客团队博客发布你们项目的设计文档(技术规格说明书). 截止时间:2015-11-03
- 2-Eleventh Scrum Meeting20151211
第二阶段任务分工整理会议 1.会议任务: (1)明晰第二阶段的开发内容,统计未完成的功能留需完善开发. (2)安排任务分工,每个人的工作安排. (3)PM职位担任. (4)博客内容负责. 2.会议记录 ...
- Linux内核分析——第六周学习笔记20135308
第六周 进程的描述和进程的创建 一.进程描述符task_struct数据结构 1.操作系统三大功能 进程管理 内存管理 文件系统 2.进程控制块PCB——task_struct 也叫进程描述符,为了管 ...
- Linux内核分析(第六周)
进程的控制与创建 一.进程的描述 1.操作系统内核的三大功能:进程管理(核心),内存管理,文件系统: 2.状态: fork() task_zombit(终止) task_running(就绪:但是没有 ...
- linux内核分析第五周学习笔记
linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- 关于 error C2039: “create”: 不是“cocos2d::GLView”的成员的解决方法
问题: 跑一个demo,因为是涉及3.x版本的引擎,不是很熟悉,在VS2013上运行,报错 error C2039: “create”: 不是“cocos2d::GLView”的成员 解决: 通过查阅 ...