奶盖拌饭 NKOJ8457
- 题意:一个无向图,每次询问给出一条边,问这条边的最大值满足这条边一定在这个图的最小生成树上,如果没有上限输出-1。
- 思路:考场上想过的,将分为两类,(非)树边。
1.亿点性质
- 非树边:加上这条边所构成的环上的边都可能替代它,所以它应该是两点树上路径max-1
- 树边:若树边在非树边两端点的路径上,则该非树边可能更新该树边。而树边应该为所有能更新它的非树边min-1。
2.解法
- 费树边:倍增记录mx
- 树边:路径覆盖并查集(自己取名的qaq),枚举所有非树边,暴力往上跳,更新路径上的树边最小值
??TLE!!肯定不能暴力!
先将非树边按边权从小到大排序,所以一条树边只会被更新一次。中间我们维护一个新的并查集,一条边被更新后直接将边的根指到自己的父亲的根(下次就直接get_fa不会经过该点了,并查集还要路径压缩cj快!)
3.代码:写了半个晚自习:
#include<bits/stdc++.h>
using namespace std;
static char buf[1000000],*p1=buf,*p2=buf,obuf[1000000],*p3=obuf;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++
#define putchar(x) (p3-obuf<1000000)?(*p3++=x):(fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=x)
template<typename item>
inline void read(register item &x)
{
x=0;register char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
}
const int N=1e6+5;
const int M=2e6+5;
struct edge {int x,y,z,used,id;}E[M];
bool cmp(edge u,edge v) {return u.z<v.z;}
int ans[M],n,m,q,dep[N],ecnt,nxt[M],head[N],len[M],mn[M],to[M],fa[N],f[N][21],mx[N][21],inf=0x3f3f3f3f;
void add_edge(int u,int v,int w) {nxt[++ecnt]=head[u];to[ecnt]=v;len[ecnt]=w;head[u]=ecnt;}
int g_fa(int u) {return fa[u]==u?u:fa[u]=g_fa(fa[u]);}
void kruskal() {
sort(E+1,E+1+m,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1,j=1;i<=m&&j<n;i++) {
int u=g_fa(E[i].x),v=g_fa(E[i].y);
if(u!=v) {
fa[u]=v;
add_edge(E[i].x,E[i].y,E[i].z),add_edge(E[i].y,E[i].x,E[i].z);
E[i].z=inf,E[i].used=1;
j++;
}
}
}
void dfs(int u,int fa) {
for(int i=head[u];i;i=nxt[i]) {
int v=to[i];
if(v==fa)continue;
dep[v]=dep[u]+1;
f[v][0]=u,mx[v][0]=len[i];
for(int i=1;i<=19;i++)
f[v][i]=f[f[v][i-1]][i-1],mx[v][i]=max(mx[v][i-1],mx[f[v][i-1]][i-1]);
dfs(v,u);
}
}
int Lca(int u,int v) {
if(dep[u]<dep[v]) swap(u,v);
int k=dep[u]-dep[v],res=0;
for(int i=0;i<=19;i++)if((1<<i)&k) res=max(res,mx[u][i]),u=f[u][i];
if(u==v) return res;
for(int i=19;i>=0;i--) {
if(f[u][i]!=f[v][i]) res=max(res,max(mx[u][i],mx[v][i])),u=f[u][i],v=f[v][i];
}
return max(res,max(mx[u][0],mx[v][0]));
}
void work() {
memset(mn,-1,sizeof(mn));
sort(E+1,E+1+m,cmp);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++) {
if(E[i].used) continue;
int u=E[i].x,v=E[i].y;
while(u!=v) {
if(dep[u]<dep[v]) swap(u,v);
if(mn[u]==-1)mn[u]=E[i].z;
int r=g_fa(f[u][0]);
fa[u]=r,u=r;
}
}
}
void solve() {
for(int i=1;i<=m;i++) {
int u=E[i].x,v=E[i].y;
if(dep[u]<dep[v]) swap(u,v);
if(E[i].used) {
if(mn[u]==-1) ans[E[i].id]=-1;
else ans[E[i].id]=mn[u]-1;
}
else ans[E[i].id]=Lca(u,v)-1;
}
}
int main() {
read(n),read(m);
for(int i=1;i<=m;i++) read(E[i].x),read(E[i].y),read(E[i].z),E[i].id=i;
kruskal();
dep[1]=1,dfs(1,0);
work();
solve();
read(q);
while(q--) {
int s;
read(s);
printf("%d\n",ans[s]);
}
return 0;
}
ps.还有最近的题全要用fread的快读qwq……
奶盖拌饭 NKOJ8457的更多相关文章
- 本溪6397.7539(薇)xiaojie:本溪哪里有xiaomei
本溪哪里有小姐服务大保健[微信:6397.7539倩儿小妹[本溪叫小姐服务√o服务微信:6397.7539倩儿小妹[本溪叫小姐服务][十微信:6397.7539倩儿小妹][本溪叫小姐包夜服务][十微信 ...
- [nRF51822] 6、基于nRF51822平台的flash读写研究
前言 本文重点介绍flash的数据存取特性.flash的内存划分.一个简单的存取图片的内存管理方式,以及对flash写前删的时间.删后读的时间.写后读的时间进行测量的一个小实验.目的在于更全面了解fl ...
- OCR技术
"起初我写这篇教程是在情人节,OCR可以带给你一整年的爱". 你之前肯定已经见过,OCR技术被应用于在平板电脑上将扫描文件处理成手写字迹,还被应用于谷歌最近添加到他们的Transl ...
- ubuntu1604 golang环境
copy来的,这里记录一下 1. 升级系统: sudo apt-get upgrade 2. 安装docker 下载docker-ce: https://download.docker.com/lin ...
- mq(1):简介
1.mq的使用场景 以前的我,一直都没太搞明白,为什么我们那么需要消息队列,直到我看到了网友scienjus.的这个例子. 例子:假设用户在你的软件中注册,服务端收到用户的注册请求后,它会做这些操作: ...
- .NET环境下使用水晶报表
.NET环境下使用水晶报表 听语音 | 浏览:3280 | 更新:2013-12-20 13:36 1 2 3 4 5 6 7 分步阅读 水晶报表(Crystal Reports)-商务智能软件,通常 ...
- python中的循环和编码,运算符, 格式化输出
1.while循环 现在让我们来看看python中的while循环 格式为 while 条件 循环体 (break) (continue) 中断循环的关键字有break和continue, brea ...
- 我的OI生涯 第四章
第四章 晚上来机房的人越来越多了,我也注意到一个常年独自坐在一个角落的男人————郝哥. 郝哥为人很安静,只是那时我还不知道他好不好,就没有与他交流过什么,这个优秀的男人以后我们还会提到,这里先不讲. ...
- 2018 Spring Single Training B (uva 572,HihoCoder 1632,POJ 2387,POJ 2236,UVA 10054,HDU 2141)
这场比赛可以说是灰常的水了,涨信心场?? 今下午义务劳动,去拿着锄头发了将近一小时呆,发现自己实在是干不了什么,就跑到实验室打比赛了~ 之前的比赛补题补了这么久连一场完整的都没补完,结果这场比完后一小 ...
随机推荐
- js压缩图片到2m以下
用的canvas.这个问题测试妹子反馈了好几次bug,解决了好多次,虽然用了比较僵硬的办法,但总算最终解决了. 因为php的同事说,页面上的图片要直接调用七牛的接口上传到七牛,所以后端那边不能处理,必 ...
- 重磅:前端 MVVM 与 FRP 的升阶实践 —— ReRest 可视化编程
ReRest (Reactive Resource State Transfer) 是前端开发领域新兴的方法论体系,它继承了 MVVM 与 FRP 编程理念,在技术上有不少创新.本文从专利稿修改而来, ...
- javaweb之浏览功能
今天我们来写浏览功能,浏览主要是通过sql语句将数据库里的数据查出来,并显示在页面上. 一.dao层 在上一篇文章的基础上dao层加入浏览方法. public List<Course> l ...
- 使用js实现复选框的全选、取消功能
id为all的想设置全选的那个框的id,name为checkname[]的是每个小复选框: 第一种: <script> function checkAll() { var all=docu ...
- MAUI VS Preview 2.1 win 下无法调试ios, 目前无解
Microsoft Visual Studio Community 2022 (64 位) - Preview 版本 17.2.0 Preview 2.1 报错 严重性 代码 说明 项目 文件 行 禁 ...
- 免费的天气API
高德地图天气 天气查询-API文档 请求示例: { "status": "1", "count": "1", " ...
- JavaSE常用类之File类
File类 只用于表示文件或目录的信息,不能对文件内容进行访问. java.io.File类∶代表文件和目录.在开发中,读取文件.生成文件.删除文件.修改文件的属性时经常会用到本类. File类不能访 ...
- 厉害!我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证!
小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么锅都想甩给他,啊,不,一不小心怎么把心里话全说出来了呢?重来! 小二是新来的实习生,作为技术 leader,我还是很负责任的,有什么 ...
- 如何为我的VUE项目编写高效的单元测试--Jest
Unit Testing(单元测试)--Jest 一个完整的测试程序通常由几种不同的测试组合而成,比如end to end(E2E)测试,有时还包括整体测试.简要测试和单元测试.这里要介绍的是Vue中 ...
- SpringCloud入门简述
1.微服务简述 微服务,是一个小型的服务,也是一种设计理念,将一个大型繁杂的系统拆分为多个小型的服务,进行独立部署,这些服务在独立进程中运行,通过特定的协议进行通信 优点: 轻量化:一个服务不 ...