soj97 旅行
题意:给你一棵n个点的树。m个操作,op 1:在点i上建立银行。op 2:询问从点x开始可以经过至少一个银行走到的点中编号第二大的点。
n,m<=1e5.
标程:
#include<bits/stdc++.h>
using namespace std;
int read()
{
int x=;char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (''<=ch&&ch<='') x=(x<<)+(x<<)+ch-'',ch=getchar();
return x;
}
const int N=;
set<int,greater<int> > s;
set<int,greater<int> >::iterator it;
int cnt,head[N],Mx[N],Mxc[N],f[N],tot,ans[N],tag[N],u,v,n,m;
struct node{int to,next;}num[N*];
struct _node{int op,x;}q[N];
void add(int x,int y)
{num[++cnt].to=y;num[cnt].next=head[x];head[x]=cnt;}
int find(int x){return x==f[x]?x:f[x]=find(f[x]);}
void merge(int x,int y)
{
if (x==y) return;
s.erase(Mx[x]);s.erase(Mx[y]);
s.erase(Mxc[x]);s.erase(Mxc[y]);
if (Mx[x]>Mx[y]) Mxc[y]=Mx[y],Mx[y]=Mx[x];//注意最大次大的传递
else if (Mx[x]>Mxc[y]) Mxc[y]=Mx[x];
if (Mxc[x]>Mxc[y]) Mxc[y]=Mxc[x];
s.insert(Mx[y]);s.insert(Mxc[y]);
f[x]=y;
}
void dfs(int x,int fa)
{
if (tag[x]) s.insert(x);//银行作为单点也要加入
for (int i=head[x];i;i=num[i].next)
if (num[i].to!=fa)
{
dfs(num[i].to,x);
if (!tag[num[i].to]&&!tag[x]) merge(find(num[i].to),find(x));
}
}
int qry(int x)
{
int fl=;x=find(x);
for (it=s.begin();it!=s.end();++it)
{
if (*it==Mx[x]||*it==Mxc[x]) continue;
if (!fl) fl=;else return *it;
}
return -;
}
int main()
{
n=read();m=read();tot=;s.clear();
memset(head,,sizeof(head));cnt=;
for (int i=;i<n;i++) u=read(),v=read(),add(v,u),add(u,v);
for (int i=;i<=n;i++) f[i]=i,Mx[i]=i,Mxc[i]=,s.insert(i);
for (int i=;i<=m;i++)
{
q[i].op=read(),q[i].x=read();
if (q[i].op==) tag[q[i].x]++;//有可能被该银行被统计多次
}
dfs(,-);
for (int i=m;i>=;i--)
{
if (q[i].op==)
{
int now=find(q[i].x);tag[q[i].x]--;
if (!tag[q[i].x])
for (int j=head[q[i].x];j;j=num[j].next)
if (!tag[num[j].to]) merge(find(num[j].to),now);
}else ans[++tot]=qry(q[i].x);
}
while (tot) printf("%d\n",ans[tot--]);
return ;
}
题解:并查集+技巧
暴力可以过很多啊,倒着枚举编号点,判断x和该编号点的路径上是否有银行,树链剖分+线段树(lct)维护即可。
因为连通块拆分比较麻烦,考虑倒着执行操作,相当于删去银行。每删去一个银行就相当于把若干个连通块合并。
询问即是问除了x点所在连通块其他部分的第二大。维护一个保存每个连通块最大次大的set,取出不等于当前连通块最大次大的第二大元素,最多取4次即可。
时间复杂度O((n+m)(logn+a(n))。
soj97 旅行的更多相关文章
- BZOJ 3531: [Sdoi2014]旅行 [树链剖分]
3531: [Sdoi2014]旅行 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1685 Solved: 751[Submit][Status] ...
- vijos P1780 【NOIP2012】 开车旅行
描述 小\(A\)和小\(B\)决定利用假期外出旅行,他们将想去的城市从\(1\)到\(N\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为 ...
- 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流
1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 388 Solved: 212[Submit ...
- codevs 1036 商务旅行(Targin求LCA)
传送门 Description 某首都城市的商人要经常到各城镇去做生意,他们按自己的路线去做,目的是为了更好的节约时间. 假设有N个城镇,首都编号为1,商人从首都出发,其他各城镇之间都有道路连接,任意 ...
- nyoj 71 独木舟上的旅行(贪心专题)
独木舟上的旅行 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别.一条独木舟最多只能乘坐两个人,且乘客 ...
- 【bzoj3531】 [SDOI2014]旅行
题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰.为了方便,我们 ...
- tomcat源码分析(三)一次http请求的旅行-从Socket说起
p { margin-bottom: 0.25cm; line-height: 120% } tomcat源码分析(三)一次http请求的旅行 在http请求旅行之前,我们先来准备下我们所需要的工具. ...
- 11.14 T2 小x的旅行(小x的旅行)
1.小x的旅行 (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...
- hdoj 2066 一个人的旅行
Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...
随机推荐
- P1613 跑路(倍增)
P1613 跑路(倍增) 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十 ...
- 使用Beyond Compare作为Perforce默认的文件比较工具
使用perforce自带的文件比较工具有时候会遇到乱码的情况,如下: 暂时不知道如何解决上述问题,因此想换个文件比对工具,比如Beyond Compare. 设定位置:Edit->prefere ...
- 数据分析相关概念(numpy)
矢量 矢量是指一堆形成的集合. 多维数组也叫做矢量化计算. 单独一个数叫做标量 例: import datetime as dt import numpy as np n2=10000 start2 ...
- shell 命令 进程相关
1. 进程标识号PID 唯一性 pid 为0 内核进程,linux内核创建 pid 为1 init进程,系统最早创建的进程,init是所有用户进程的祖先 2. 查看系统进程信息 (1)[ ...
- MySQL入门基础知识
1.MySQL环境变量的配置 操作数据库时,要进入bin目录,如下: 但是如果进行配置环境变量,就不必切换路径,如下图所示,即使没有在G:\mysql-8.0.16-winx64\bin下,数据库依然 ...
- vue+ElementUI——表格分页(前端实现方法)
1.使用ElementUI中的<el-table></el-table>和 <el-pagination></el-pagination>组件来实现 2 ...
- js 高级 原型与原型链
* 所有函数都有一个特别的属性: * `prototype` : 显式原型属性* 所有实例对象都有一个特别的属性: * `__proto__` : 隐式原型属性 1. 每个函数都有一个prototy ...
- 下载mysql出现的问题
报错------>解决方法
- js 异步编程思想
一.js中的异步编程有四种情况 1.定时器 2.所有的事件绑定 3.ajax异步请求 4.回调函数
- iOS开发NSLayoutConstraint代码自动布局
1.NSLayoutConstraint简介 适配界面大多用Masonry工具,也是基于NSLayoutConstraint写的!通过使用两个类方法实现自动布局: + (NSArray<__ki ...