spoj Qtree6/bzoj 3637 Query on a tree VI(树链剖分+线段树/LCT)

DeepSeek-V3本地Docker容器化部署 通过以上步骤,你可以在本地上成功通过容器化部署DeepSeek-V3。安装完成后,启动Docker Desktop。如果需要后台运行,可以加上。 阅读详情

题意:

思路:

首先,我们要开两颗线段树,一颗表示,当前节点为白时,和子树所组成的最大联通块大小是多少,另一颗表示,当前节点为黑时,和子树所组成的最大联通块大小是多少。
那么我们查询点u的答案的时候,就向上找到最远的相同颜色的点v,点v所保存的答案就是u的答案(我们v为最远同色祖先)。
更新某个点u的颜色的时候,就是把u的父亲和最远同色祖先的父亲,这一条路径上的都更新(注意,黑白各更新一次,且将对应不同路径),为什么是把u的父亲和最远同色祖先的父亲更新一次,这个根据我们之前对他们的定义就能理解了,这里用树剖+线段树维护即可。
那么还有一个问题,怎么快速找到最远公共祖先,就是树剖爬,然后二分某个链即可(注意你二分的时候左右值分别表示的是什么)
最后,注意根,以及你在爬的时候,每个点表示的颜色

错误及反思:

卡了两天,真的毒啊,各种边界,各种细节,一个人慢慢摸索了好久才AC
这个代码在spoj过了,在bzojT了,把线段树改成树状数组应该就能AC了,可是我实在不想改了(不过代码写的很丑,主要是确实改烦了)

代码:

#include<bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int N =100010;

int tot=0,tid=1,n,q;
int top[N],si[N],fa[N],first[N],son[N],depth[N],id[N],rnk[N];
int cnt[N*4],segtree[2][N*4],lazy[2][N*4];//0 for white 1 for black
// cnt calculate for white   so 0 for black 1 for white

struct E{
    int to,next;
}e[N*2];

void build(int l,int r,int rt){
    if(l==r){
        segtree[1][rt]=si[rnk[l]];
        segtree[0][rt]=1;
        return ;
    }
    int m=(l+r)/2;
    build(lson); build(rson);
}

void addedge(int x,int y){
    e[tot].to=y;
    e[tot].next=first[x];
    first[x]=tot++;
}

void dfs1(int now,int bef,int dep){
    fa[now]=bef;
    depth[now]=dep;
    si[now]=1;
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=bef){
            dfs1(e[i].to,now,dep+1);
            si[now]+=si[e[i].to];
            if(son[now]==-1) son[now]=e[i].to;
            else son[now]=si[e[i].to]>si[son[now]]?e[i].to:son[now];
        }
}

void dfs2(int now,int tp){
    top[now]=tp;
    id[now]=tid++;
    if(son[now]!=-1) dfs2(son[now],tp);
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=fa[now]&&e[i].to!=son[now])
            dfs2(e[i].to,e[i].to);
}

void init(){
    memset(first,-1,sizeof(first));
    memset(son,-1,sizeof(son));
}

void pushdown(int x,int l,int r,int rt){
    if(lazy[x][rt]){
        lazy[x][rt<<1]+=lazy[x][rt];
        lazy[x][rt<<1|1]+=lazy[x][rt];
        segtree[x][rt<<1]+=lazy[x][rt];
        segtree[x][rt<<1|1]+=lazy[x][rt];
        lazy[x][rt]=0;
    }
}

void changecnt(int p,int l,int r,int rt){
    if(l==r){
        cnt[rt]=!cnt[rt];
        return ;
    }
    int m=(l+r)/2;
    if(m>=p) changecnt(p,lson);
    else changecnt(p,rson);
    cnt[rt]=cnt[rt<<1]+cnt[rt<<1|1];
}

void changeseg(int L,int R,int v,int l,int r,int rt,int x){
    if(L<=l&&R>=r){
        lazy[x][rt]+=v;
        segtree[x][rt]+=v;
        return ;
    }
    pushdown(x,l,r,rt);
    int m=(l+r)/2;
    if(L<=m) changeseg(L,R,v,lson,x);
    if(R>m) changeseg(L,R,v,rson,x);
}

int querycnt(int L,int R,int l,int r,int rt){
    if(L<=l&&R>=r) return cnt[rt];
    int m=(l+r)/2,ans=0;
    if(m>=L) ans+=querycnt(L,R,lson);
    if(m<R) ans+=querycnt(L,R,rson);
    return ans;
}

int queryseg(int p,int l,int r,int rt,int x){
    if(l==r)return segtree[x][rt];
    int m=(l+r)/2;
    pushdown(x,l,r,rt);
    if(m>=p) return queryseg(p,lson,x);
    return queryseg(p,rson,x);
}

int getans(int u){
    int f=top[u],col=querycnt(id[u],id[u],1,n,1);
    while(f!=1){
        int x=querycnt(id[f],id[u],1,n,1);
        if(col&&x!=depth[u]-depth[f]+1) break;
        if(!col&&x) break;
        if(col!=querycnt(id[fa[f]],id[fa[f]],1,n,1)) break;
        u=fa[f];
        f=top[u];
    }

    while(id[u]>id[f]+1){
        int m=(id[u]+id[f])/2;
        int x=querycnt(m,id[u],1,n,1);
        if(col){
            if(x==depth[u]-depth[rnk[m]]+1) u=rnk[m];
            else f=rnk[m];
        }
        else{
            if(x==0) u=rnk[m];
            else f=rnk[m];
        }
    }
    if(querycnt(id[fa[u]],id[fa[u]],1,n,1)==col) u=fa[u];

    return queryseg(id[u],1,n,1,!col);
}

void modify(int u){
    int v=u;
    int col=querycnt(id[u],id[u],1,n,1),num=queryseg(id[u],1,n,1,!col);
    changecnt(id[u],1,n,1);
    if(u==1) return ;

    u=fa[u];
    int f=top[u];

    while(f!=1){
        int x=querycnt(id[f],id[u],1,n,1);
        if(col&&x!=depth[u]-depth[f]+1) break;
        else if(col) changeseg(id[f],id[u],-num,1,n,1,!col);

        if(!col&&x) break;
        else if(!col) changeseg(id[f],id[u],-num,1,n,1,!col);

        u=fa[f];
        f=top[u];
    }

    while(id[u]>id[f]+1){
        int m=(id[u]+id[f])/2;
        int x=querycnt(m,id[u],1,n,1);
        if(col){
            if(x==depth[u]-depth[rnk[m]]+1){
                changeseg(m+1,id[u],-num,1,n,1,!col);
                u=rnk[m];
            }
            else f=rnk[m];
        }
        else{
            if(x==0){
                changeseg(m+1,id[u],-num,1,n,1,!col);
                u=rnk[m];
            }
            else f=rnk[m];
        }
    }
    if(u!=f&&col==querycnt(id[u],id[u],1,n,1)) changeseg(id[u],id[u],-num,1,n,1,!col);
    if(col!=querycnt(id[u],id[u],1,n,1)) f=u;
    changeseg(id[f],id[f],-num,1,n,1,!col);

    u=v;
    col=!col;
    num=queryseg(id[u],1,n,1,!col);
    u=fa[u];
    f=top[u];
    while(f!=1){
        int x=querycnt(id[f],id[u],1,n,1);
        if(col&&x!=depth[u]-depth[f]+1) break;
        else if(col) changeseg(id[f],id[u],num,1,n,1,!col);

        if(!col&&x) break;
        else if(!col) changeseg(id[f],id[u],num,1,n,1,!col);
        u=fa[f];
        f=top[u];
    }

    while(id[u]>id[f]+1){
        int m=(id[u]+id[f])/2;
        int x=querycnt(m,id[u],1,n,1);
        if(col){
            if(x==depth[u]-depth[rnk[m]]+1){
                changeseg(m+1,id[u],num,1,n,1,!col);
                u=rnk[m];
            }
            else f=rnk[m];
        }
        else{
            if(x==0){
                changeseg(m+1,id[u],num,1,n,1,!col);
                u=rnk[m];
            }
            else f=rnk[m];
        }
    }
    if(u!=f&&col==querycnt(id[u],id[u],1,n,1)) changeseg(id[u],id[u],num,1,n,1,!col);
    if(col!=querycnt(id[u],id[u],1,n,1)) f=u;
    changeseg(id[f],id[f],num,1,n,1,!col);
    return ;
}

int main(){
    init();
    scanf("%d",&n);
    for(int i=0,u,v;i<n-1;i++){
        scanf("%d%d",&u,&v);
        addedge(u,v); addedge(v,u);
    }
    dfs1(1,1,1); dfs2(1,1);
    for(int i=1;i<=n;i++) rnk[id[i]]=i;
    build(1,n,1);
    scanf("%d",&q);
    while(q--){
        int k,u;
        scanf("%d%d",&k,&u);
        if(k) modify(u);
        else printf("%d\n",getans(u));
    }
}
【YOLOv11多模态融合改进】| CVPR2025 LCA轻量交叉注意力 双向模态交叉引导 + 双支路噪点抑制,兼顾纹理与热目标特征融合 可见光模态富含纹理、色彩、边缘细节,但夜间/低照度场景信噪比极低,暗区噪声泛滥;红外模态依靠热辐射凸显弱小目标、暗区物体轮廓,但缺失真实色彩与精细纹理。简单拼接/逐加融合仅做浅层特征叠加,无法建立可见光纹理、红外热特征的双向引导关联,两类模态互补信息无法精准互通;普通自注意力仅单模态内部建模,跨模态交互匮乏,红外热目标易被可见光暗噪声淹没,可见光有效纹理易被红外灰度信息覆盖; 阅读详情

相关推荐

OpenVins解析:基于滤波框架的SLAM

这一方式存在的关键问题是匹配耗时很长,对性能影响显著。可以参考ORBSLAM3中的匹配方式来对其优化,比如左右目匹配可以在极线上搜索,前后帧可以利用运动先验投影匹配。理论上加入路标点会提升精度,代价是增加了计算量。着重说下基于描述子的匹配:OpenVins中匹配的方式是robust_match(),里面是调用的opencv的。openvins中不仅仅进行了传统的MSCKF更新(状态向量中不包含路标点),还在。中进行了包含路标点的估计更新。图像帧到来时,利用IMU递推得到的位姿给该图像帧赋初值。

qq_18076309的博客 4074

[SP16549]QTREE6

luogu vjudge 题意 给你一棵n个点的树,编号1~n。每个点可以是黑色,可以是白色。初始时所有点都是黑色。支持两种操作: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥有相同的颜色 1 u:翻转u的颜色 sol 第一问其实就是问u所在的同色连通块的大小。 有一种很直接的想法就是,维护两种颜色的\(LCT\),在每一种颜色的\(LCT\)中把同色连通块\(link...

abcyan1235的博客 169

LinuxCNC 源码解析:从界面开发到硬件交互的实战指南

本文深入解析LinuxCNC源码架构,从用户界面开发到硬件交互的实战指南。涵盖GTK与Tkinter界面开发、HAL硬件抽象层、G代码解析器改造及运动控制核心等关键模块,提供定制化开发技巧与性能优化方案,助力开发者高效掌握数控系统开发。

weixin_27066963的博客 190

Qtree 6-LCT

题意 给你一棵n个点的树,编号1~n,共m次操作。每个点可以是黑色,可以是白色。初始时所有点都是黑色。下面有两种操作: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥有相同的颜色 1 u:翻转u的颜色 数据范围 1≤n,m≤1051≤n,m≤1051\leq n,m\leq 10^5 题解 先建两颗树分别维护两种颜色。保证同色的结点只有在对应颜色的lct内...

远行客 380

Ubuntu22.04下3分钟搞定GitHub加速:SwitchHosts+小鱼工具保姆级配置指南

本文提供Ubuntu22.04下快速解决GitHub下载超时问题的保姆级教程,通过SwitchHosts图形化工具和小鱼一键换源工具实现高效加速。详细步骤包括环境准备、工具安装配置及验证方法,帮助开发者轻松优化GitHub访问速度,提升工作效率。

weixin_29258297的博客 564

MATLAB实战:手把手教你实现Gardner环路位同步(附完整代码)

本文通过MATLAB实战,详细讲解了Gardner环路位同步算法的原理与实现。内容涵盖插值滤波器、定时误差检测、环路滤波器与数控振荡器等核心模块,并提供完整代码和调试技巧,帮助读者掌握数字通信中关键的符号定时同步技术。

weixin_29048775的博客 174

[BZOJ3637][LCT]Qtree6

BZOJ3637 LCT维护连通块的一个题 一个简单的想法是直接两个LCT分别维护黑白森林,改变点的时候就把所有出边linkcut一下 然而菊花图可以随便卡 被卡的关键在于这个算法是以点的出度为时间复杂度瓶颈的,所以考虑一个和点的出度无关的算法 树有一个性质,每个点可以有很多个儿子(上面那个算法被卡的关键),但是只有一个父亲(下面这个算法的实现基础),所以我们link cut只考虑一个点和其父亲的...

romiqi 201

Tessent IJTAG ICL:从规范到实践的硬件描述语言指南

本文深入解析Tessent IJTAG ICL语言在硬件测试中的应用,从规范到实践提供全面指南。通过模块化设计、网络提取与编辑等实战技巧,帮助工程师高效构建标准化测试网络,显著提升芯片测试效率与覆盖率。特别分享TDR/SIB/TAP的ICL实现方法及调试策略,适用于SoC、车载芯片等复杂场景。

weixin_33606346的博客 300

QTREE6 - Query on a tree VI 解题报告

QTREE6 - Query on a tree VI 题目描述 给你一棵\(n\)个点的树,编号\(1\)~\(n\)。每个点可以是黑色,可以是白色。初始时所有点都是黑色。下面有两种操作请你操作给我们看: 0 u:询问有多少个节点v满足路径u到v上所有节点(包括)都拥有相同的颜色 1 u:翻转u的颜色 输入格式 一行一个整数\(n\) 接下来\(n-1\)行,每行两个整数表示一条边 接下来一行一...

weixin_30505485的博客 170

基于 FPGA Vivado 信号发生器设计(附源工程)

今天给大侠带来基于 FPGA Vivado 信号发生器设计,开发板实现使用的是Digilent basys 3,如有想要入手basys3开发板的,可以联系牛总:18511371833。话不多说,上货。 本篇掌握基于 FPGA Vivado 信号发生器设计(附源工程),掌握基于添加文件和IP的Vivado工程设计流程,掌握基于Tcl的Vivado工程设计流程,学习信号发生器的基本组成结构。获取本篇相关源工程代码,可在公众号内回复“信号发生器设计源工程”。 设计原理 信号发生器...

7990

livox雷达斜装修改

指的是,使用外部的陀螺仪的话,雷达到外部陀螺仪的转换,而mid360的陀螺仪是内置在360里面的,且方向和点云方向是一致的,所以不能通过修改此处去改变陀螺仪方向。同时livox_ros_driver2中的MID360_config.json里面的。这里面的外参,只能改变点云相对陀螺仪的位姿,而不能将陀螺仪映射到你期望的倾斜角度。fast_lio中的mid360.yaml中的外参。

z1872385的博客 2709

【SPOJ】QTREE6(Link-Cut-Tree)

题面Vjudge题解很神奇的一道题目 我们发现点有黑白两种,又是动态加边/删边 不难想到LCTLCT最爆力的做法,显然是每次修改单点颜色的时候 暴力修改当前点和它的父亲以及儿子之间的连边状态但是这样显然是假的(菊花树了解一下)怎么优化呢? 对于每次操作,我们考虑如何只修改一次。 对于树上的一个结点,如果只修改一次,显然是修改和其父亲的状态。 那么,我们在考虑LCTLCT的连边操作的时候,

小蒟蒻yyb的博客 305

面经-2023-哲库Zeku-数字芯片设计

面经-2023-哲库Zeku-数字芯片设计

w0shishabi的博客 3907

SPOJ QTREE6

题意 给你一棵nnn个点的树,编号111~nnn。每个点可以是黑色,可以是白色。初始时所有点都是黑色。有两种操作 0&nbsp;u0&nbsp;u0\ u:询问有多少个节点vvv满足路径uuu到vvv上所有节点(包括)都拥有相同的颜色 1&nbsp;u1&nbsp;u1\ u:翻转uuu的颜色 Sol LCTLCTLCT做法: 黑白开两个LCTLCTLCT 然后有一个很Nai...

Cyhlnj 290

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

SPOJ QTree6 [树链剖分]

啊啊啊!!! maintain的时候忘记+1s+1,于是就。。。累死了,只剩下最后一个Qtree7. 这道题与上道题类似,关键在于路径上面判定同色,关键点在findpath上,至于线段树,我又一次惊叹于线段树在序列问题上近乎无敌的维护效率。中间的mid与mid+1的判定神来之笔。 看来我就是一只菜鸡。#include<deque> #include<vector> #include<cstdi

lemonoil的博客 862

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

[Spoj16549]Qtree6

题意:询问与uuu相同颜色的联通块的大小,带修改 考虑建立黑白两颗lctlctlct,答案就是在相应lctlctlct中,uuu所属的那棵树的大小了 至于修改的话一个非常暴力的想法就是直接cutcutcut然后linklinklink 这样的话碰到菊花图就GGGGGG了(下面我们讨论维护黑树的lctlctlct,白树同理) 考虑到原树的形态是不会变的,所以我们可以设在lctlctlct中...

BeNoble_的博客 517

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

bzoj3637 CodeChef SPOJ - QTREE6 Query on a tree VI 题解

题意:   一棵n个节点的树,节点有黑白两种颜色,初始均为白色。两种操作:1.更改一个节点的颜色;2.询问一个节点所处的颜色相同的联通块的大小。 思路:   1.每个节点记录仅考虑其子树时,假设其为黑色时所处的黑色联通块的大小和假设其为白色时所处的白色联通块的大小(树状数组维护)。   2.查询时找到深度最小的、与该点颜色相同的且两点之间的点颜色均与这两点相同(两点可以重合)(...

diyaochang9767的博客 246

SPOJ 16549 QTREE6 - Query on a tree VI

树的分治

Fuxey 1371

SPOJ QTREE 系列

QTREE Query on a tree 树链剖分:QTREE LCT:QTREE QTREE2 Query on a tree II 倍增LCA:QTREE2 PTO7J Query on a tree III dfs序+主席树:QTREE3 QTREE4 Query on a tree IV 边分治+堆:QTREE4

yamiedie_ 1395

SPOJ16549 BZOJ3637 QTREE6 - Query on a tree VI LCT

题目链接 题意: 给你一棵nnn个点的树,每个点有一个颜色,是黑色或者白色,一开始所有的点都是白色。有mmm次操作,有两种操作,第一种是把一个点的颜色黑白翻转,第二种操作是给你一个xxx,询问有多少个uuu满足到xxx的路径上的所有点颜色都相同,也就是问xxx所在的同色连通块的大小。n,m&lt;=1e5n,m&lt;=1e5n,m<=1e5。 题解: 又不会,抄了y_imm...

forever_shi的博客 239

QTREE6 - Query on a tree VI

昨晚调了半天,上BZOJ一交,发现自己T了。 然后上Vjudge上一交,半天都跑不出来,估计也T了,然后只能去睡觉了QAQ。 然而今早起来一看突然发现A了

wamach的博客 395

【Qtree】Query on a tree系列LCT解法

Qtree1-7 Qtree1 裸的树链剖分,当然也可以用LCT写,就不说什么了... Qtree2 倍增lca,当然也可以用LCT写,就不说什么了... Qtree3 裸的树链剖分,当然也可以用LCT写,就不说什么了... 接下来的Qtree4-7才是重点 推荐顺序(7->6->4->5),因为写了7就可以改一改贴到6,写了4就可以改一改贴到5了,瞬间少写两题...

weixin_30371469的博客 314

SP16549 QTREE6 - Query on a tree VI (LCT)

这个题的思路还是很巧妙的。 发现查询的信息不是关于黑色或者白色,而是相同颜色,所以不能仅仅用一颗树来做了 那么考虑建立黑白两棵树。 一个比较暴力的思想就是每次换颜色,然后暴力的断掉目前的所有边,然后和与翻转颜色之后 与之相同的点进行连边,但是这样的方法在菊花图的时候是不对的 一个非常巧妙的思路,将颜色从点转到边上,也就是说我们以1为根的话,若当前在黑色树中存在i→fa[i]i\rightarrow...

y_immortal的博客 QwQ(qdez_ymh) 290

SPOJ QTREE6 lct

题目链接 岛娘出的题,还是比较容易的 #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; template inline bool rd(T &

九野的博客 1381

BZOJ 3637: Query on a tree VI (树链剖分+树状数组)

BZOJ 3637: Query on a tree VI题意概述:给一棵n个结点的树,结点有黑白两色,一开始全为黑色. 对于q个操作,每个操作由两个整数op,u给出. 当op=0,将u点颜色反转. 当op=1,求与u点相连的点的个数(若两点及两点间路径上均为同色点,则两点相连,否则不相连),即求从u点往四周扩散的同色块大小.题目分析:(初学链剖,戳开了这个题,然后……d了一天的bug)在网上

Continue 1823

[BZOJ3637]-QTREE6-LCT

说在前面 码一码LCT 再不码都要遗忘掉了… 题目 BZOJ3637传送门 题目大意 给出一棵有 nnn 个点的树,树的节点有颜色,初始全部是黑色 现在需要支持以下两种操作,总操作数为 mmm: 0&nbsp;u0&nbsp;u0~u :询问 uuu 所在的同色联通块的大小 1&nbsp;u1&nbsp;u1~u :将 uuu 点反转颜色 范围:n,m≤105n,m≤10...

泉華子的OI足迹 369
上一篇: bzoj 3052/洛谷 P4074/uoj 58 [WC2013]糖果公园(树上带修莫队)
下一篇: spoj cot Count on a tree (主席树)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值