题意:给定一棵树,带边权。然后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. 新添加的用户无法sudo解决方案

    问题:xxx(用户名) is not in the sudoers file. This incident will be reported. 用户管理: 1.创建用户 (1)方法1 $ sudo a ...

  2. Effective.Java第67-77条(异常相关)

    67.  明智审慎地进行优化 有三条优化的格言是每个人都应该知道的: (1)比起其他任何单一的原因(包括盲目的愚钝),很多计算上的过失都被归咎于效率(不一定能实现) (2)不要去计算效率上的一些小小的 ...

  3. 【SCALA】2、驼峰,下划线互转

    1.刚开始写scala,发现确实还是很不熟悉,api以及语法的使用都不是很简洁,这写出来跟java也没差多少... 献丑了 package spark /** * @ProjectName: cutt ...

  4. mysql获取某个字段平均值方法AVG函数的使用

    直接上脚本 ,)) AS 平均分 FROM students WHERE sex= '男' 其中,特别说明一下CAST关键字 CAST(字段名 as 要转换的类型) #其中,可以转换的类型为: CHA ...

  5. FusionInsight大数据开发---Kafka应用开发

    Kafka应用开发 了解Kafka应用开发适用场景 熟悉Kafka应用开发流程 熟悉并使用Kafka常用API 进行Kafka应用开发 Kafka的定义Kafka是一个高吞吐.分布式.基于发布订阅的消 ...

  6. FusionInsight大数据开发---Hive应用开发

    Hive应用开发 了解Hive的基本架构原理 掌握JDBC客户端开发流程 了解ODBC客户端的开发流程 了解python客户端的开发流程 了解Hcatalog/webHcat开发接口 掌握Hive开发 ...

  7. drools -规则语法

    文章结构 1. 基础api 2. FACT对象 3. 规则 4. 函数 1. 基础api 在 Drools 当中,规则的编译与运行要通过Drools 提供的各种API 来实现,这些API 总体来讲可以 ...

  8. 核与线程 CPU 4核8线程 的解释

    1.物理CPU: 物理CPU就是计算机上实际配置的CPU个数.在linux上可以打开cat /proc/cpuinfo 来查看,其中的physical id就是每个物理CPU的ID,能找到几个phys ...

  9. vs2015下编译免费开源的jpeg库,ijg的jpeg.lib

    vs2015下编译免费开源的jpeg库,ijg的jpeg.lib 1. 去Independent JPEG Group官网www.ijg.org下载jpegsrc,我下载的版本是jpegsrc9c.z ...

  10. (原创)理解主机设备(PLC,PC机)之间的以太网通信

    主机设备:PC机,PLC 网络设备:家用路由器 局域网包括了有线局域网和无线局域网(WIFI).怎么去使用2者? 网络设备的职责最终目的为了帮助2台主机的数据传输.路由器,交换机范围不同,目的相同.在 ...