题意:给定一棵树,带边权。然后Q次询问,每次给出(u,v),求这个路径上最小的未出现的边权。

思路:树上莫队,求mex可以用分块或者bitset,前者可能会快一点。   莫队过程:求出欧拉序,即记录dfs的in和out时间戳。 然后摊平成数组,在数组上进行莫队。

一般的莫队需要单独考虑LCA,因为LCA不在这个区间里。 但是由于这里是边权,用儿子代替边权,所以LCA本来就不用考虑。

这个序列里,有效的部分是出现奇数次的,所以用vis记录奇偶性,如果是奇,表示加; 偶表示删。

如果想再快一点,可以把bitset改为分块; 以及,用王室联邦分块法(即后序遍历,这样可以保证一个块更近一些)。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
bitset<maxn>S; int num[maxn],val[maxn],ans[maxn];
int Laxt[maxn],Next[maxn],To[maxn],len[maxn],cnt;
int p[maxn],L[maxn],R[maxn],times,B,N,Q,vis[maxn];
struct in{
int l,r,id;
bool friend operator <(in w,in v){
if(w.l/B!=v.l/B) return w.l<v.l;
return w.r<v.r;
}
}s[maxn];
void add(int u,int v,int w)
{
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; len[cnt]=w;
}
void dfs(int u,int f)
{
p[++times]=u; L[u]=times;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i]; if(v==f) continue;
val[v]=len[i]; dfs(v,u);
}
p[++times]=u; R[u]=times;
}
void fcy(int pos)
{
pos=p[pos];
if(val[pos]>N) return ;
vis[pos]^=;
if(vis[pos]) {
num[val[pos]]++;
if(num[val[pos]]==) S[val[pos]]=;
}
else {
num[val[pos]]--;
if(num[val[pos]]==) S[val[pos]]=;
}
}
void solve()
{
sort(s+,s+Q+);
int l=s[].l,r=s[].l-;
rep(i,,Q){
while(l<s[i].l) fcy(l++);
while(l>s[i].l) fcy(--l);
while(r<s[i].r) fcy(++r);
while(r>s[i].r) fcy(r--);
ans[s[i].id]=S._Find_first();
}
}
int main()
{
int u,v,w;
S.set(); //没出现的就是1
scanf("%d%d",&N,&Q);
B=(int)sqrt(N+N);
rep(i,,N-){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dfs(,); val[]=N+;
rep(i,,Q) {
scanf("%d%d",&u,&v);
if(L[u]>L[v]) swap(u,v);
s[i].l=R[u]; s[i].r=L[v]; s[i].id=i;
}
solve();
rep(i,,Q) printf("%d\n",ans[i]);
return ;
}

王室联邦写法: 但跑出来这个更慢?

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=;
bitset<maxn>S; int num[maxn],val[maxn],ans[maxn];
int Laxt[maxn],Next[maxn],To[maxn],len[maxn],cnt;
int p[maxn],L[maxn],R[maxn],times,B,N,Q,vis[maxn];
int q[maxn],top,g[maxn],group;
struct in{
int l,r,id;
bool friend operator <(in w,in v){
if(g[p[w.l]]!=g[p[v.l]]) return g[p[w.l]]<g[p[v.l]];
return g[p[w.r]]<g[p[v.r]];
}
}s[maxn];
void add(int u,int v,int w)
{
Next[++cnt]=Laxt[u]; Laxt[u]=cnt; To[cnt]=v; len[cnt]=w;
}
void dfs(int u,int f)
{ p[++times]=u; L[u]=times;
int now=top;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i]; if(v==f) continue;
val[v]=len[i]; dfs(v,u);
if(top-now>=B){
group++;
while(top!=now) g[q[top--]]=group;
}
}
q[++top]=u;
p[++times]=u; R[u]=times;
}
void fcy(int pos)
{
pos=p[pos];
if(val[pos]>N) return ;
vis[pos]^=;
if(vis[pos]) {
num[val[pos]]++;
if(num[val[pos]]==) S[val[pos]]=;
}
else {
num[val[pos]]--;
if(num[val[pos]]==) S[val[pos]]=;
}
}
void solve()
{
sort(s+,s+Q+);
int l=s[].l,r=s[].l-;
rep(i,,Q){
while(l<s[i].l) fcy(l++);
while(l>s[i].l) fcy(--l);
while(r<s[i].r) fcy(++r);
while(r>s[i].r) fcy(r--);
ans[s[i].id]=S._Find_first();
}
}
int main()
{
int u,v,w;
S.set(); //没出现的就是1
scanf("%d%d",&N,&Q);
B=(int)sqrt(N+N);
rep(i,,N-){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dfs(,); val[]=N+;
while(top) g[q[top--]]=group;
rep(i,,Q) {
scanf("%d%d",&u,&v);
if(L[u]>L[v]) swap(u,v);
s[i].l=R[u]; s[i].r=L[v]; s[i].id=i;
}
solve();
rep(i,,Q) printf("%d\n",ans[i]);
return ;
}

Gym - 100962F: Frank Sinatra (树上莫队+bitset)的更多相关文章

  1. spoj COT2 - Count on a tree II 树上莫队

    题目链接 http://codeforces.com/blog/entry/43230树上莫队从这里学的,  受益匪浅.. #include <iostream> #include < ...

  2. SP10707 COT2 - Count on a tree II (树上莫队)

    大概学了下树上莫队, 其实就是在欧拉序上跑莫队, 特判lca即可. #include <iostream> #include <algorithm> #include < ...

  3. 2018CCPC女生赛(树上莫队)

    签到题这里久懒得写了. B - 缺失的数据范围 Total Submission(s): 2602    Accepted Submission(s): 559 题意:求最大的N,满足N^a*[log ...

  4. P4074 [WC2013]糖果公园 树上莫队带修改

    题目链接 Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园游玩. 糖果公园的结构十分奇特,它由 nn 个游览点构 ...

  5. 【BZOJ 3735】苹果树 树上莫队(树分块+离线莫队+鬼畜的压行)

    2016-05-09 UPD:学习了新的DFS序列分块,然后发现这个东西是战术核导弹?反正比下面的树分块不知道要快到哪里去了 #include<cmath> #include<cst ...

  6. 【BZOJ-3757】苹果树 块状树 + 树上莫队

    3757: 苹果树 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1305  Solved: 503[Submit][Status][Discuss] ...

  7. [BZOJ 3052] [wc2013] 糖果公园 【树上莫队】

    题目链接:BZOJ - 3052 题目分析 这道题就是非常经典的树上莫队了,并且是带修改的莫队. 带修改的莫队:将询问按照 左端点所在的块编号为第一关键字,右端点所在的块为第二关键字,位于第几次修改之 ...

  8. 树上莫队 wowow

    构建:像线性的莫队那样,依旧是按sqrt(n)为一块分块. int dfs(int x){ ; dfn[x]=++ind; ;i<=;i++) if (bin[i]<=deep[x]) f ...

  9. BZOJ 4129: Haruna’s Breakfast [树上莫队 分块]

    传送门 题意: 单点修改,求一条链的mex 分块维护权值,$O(1)$修改$O(S)$求mex...... 带修改树上莫队 #include <iostream> #include < ...

随机推荐

  1. prometheus添加自定义监控与告警(etcd为例)

    一.步骤及注意事项(前提,部署参考部署篇) 一般etcd集群会开启HTTPS认证,因此访问etcd需要对应的证书 使用证书创建etcd的secret 将etcd的secret挂在到prometheus ...

  2. kafka参数解析+启动参数解析

    Kafka参数详解 每个kafka broker中配置文件server.properties默认必须配置的属性如下: broker.id=0 num.network.threads=2 num.io. ...

  3. @Value注解无法为static 变量赋值

    使用@Value给静态变量赋值时,出现空指针异常.经了解Spring 不允许/不支持把值注入到静态变量中.所以需要另一种方式为该变量赋值. 需要注意set方法也不要加static修饰符!

  4. 第十四节:Asp.Net Core 中的跨域解决方案(Cors、jsonp改造、chrome配置)

    一. 整体说明 1. 说在前面的话 早在前面的章节中,就详细介绍了.Net FrameWork版本下MVC和WebApi的跨域解决方案,详见:https://www.cnblogs.com/yaope ...

  5. 『Broken Robot 后效性dp 高斯消元』

    Broken Robot Description 你作为礼物收到一个非常聪明的机器人走在矩形板上.不幸的是,你明白它已经破碎并且行为相当奇怪(随机).该板由N行和M列单元组成.机器人最初位于第i行和第 ...

  6. 使用DbVisualizer 10.0.20 查询ES中的索引时需要注意的事项

    查询前5条数据 光标停在某一个查询结果框中,左下角会显示该字段的类型 查询类型是text的字段使用单引号,使用双引号查询会报错

  7. 使用ASP.NET Core MVC应用程序中的ResponseCache属性处理缓存(转载)

    HTTP响应的缓存意味着当发出HTTP请求时,服务器生成的响应由浏览器或服务器存储在某个地方,以便在对同一资源的连续HTTP请求中重复使用.实质上,我们正在存储生成的响应,并将该响应重用于后续请求一段 ...

  8. C#读写调整设置UVC摄像头画面-亮度

    有时,我们需要在C#代码中对摄像头的亮度进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...

  9. Git 管理版本/回退

    参考链接:https://www.liaoxuefeng.com/wiki/896043488029600/896954074659008 Git status命令可以让我们时刻掌握仓库当前的状态,比 ...

  10. VC/MFC如何添加启动界面

    2015-05 转自 香远益清原文VC/MFC如何添加启动界面 1.基于框架类的应用程序添加启动画面的步骤(利用组件库中的Splash Screen组件生成Splash1.cpp 和Splash1.h ...