BZOJ 2243 染色(树链剖分)

【BZOJ 2243】染色 【树链剖分】 静态查错能力显著提升233,这次3分钟就查出bug#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> #include<cctype> using namespace std; #define N 100010 #define g() getchar() #define d 阅读详情

题意:

思路:

树链剖分+线段树合并
很明显的树链剖分,但是总体有点难维护,首先我们还是要利用树链剖分的性质,从根到叶的编号是从小到大的,那么我们就知道了,对于一对点,我们把其中一个点向他们的LCA向上爬的过程,所求线段树求出的区间是连续的,而对于两个区间,如果两区间连接处的端点颜色相同,就要让ans减一即可

错误及反思:

思路其实不难,但是出了bug就很难受,一看题就知道要200行,写起来有点精神污染
左右端点有点小坑。。。要多想想

代码:

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

struct edge{
    int to,next;
}e[N*2];
int num[N*4],lk[N*4],rk[N*4],lazy[N*4];//segtree
int tot,tid,q,n;
int top[N],si[N],fa[N],first[N],son[N],depth[N],id[N],val[N],rnk[N];
char ta[10];

void addedge(int x,int y){
    e[tot].to=y;
    e[tot].next=first[x];
    first[x]=tot++;
    e[tot].to=x;
    e[tot].next=first[y];
    first[y]=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(lazy,-1,sizeof(lazy));
    tot=0; tid=1;
    memset(first,-1,sizeof(first));
    memset(son,-1,sizeof(son));
}

void pushup(int rt){
    lk[rt]=lk[rt<<1];
    rk[rt]=rk[rt<<1|1];
    num[rt]=num[rt<<1]+num[rt<<1|1]-(rk[rt<<1]==lk[rt<<1|1]);
}

void pushdown(int rt){
    if(lazy[rt]!=-1){
        num[rt<<1]=1;
        lk[rt<<1]=lazy[rt];
        rk[rt<<1]=lazy[rt];
        lazy[rt<<1]=lazy[rt];

        num[rt<<1|1]=1;
        lk[rt<<1|1]=lazy[rt];
        rk[rt<<1|1]=lazy[rt];
        lazy[rt<<1|1]=lazy[rt];

        lazy[rt]=-1;
    }
}
//初始化
void build(int l,int r,int rt){
    if(l==r){
        num[rt]=1;
        lk[rt]=val[rnk[l]];
        rk[rt]=val[rnk[l]];
        return ;
    }
    int m=(l+r)/2;
    build(lson);
    build(rson);
    pushup(rt);
}
//染色
void change(int v,int L,int R,int l,int r,int rt){
    if(L<=l&&R>=r){
        lazy[rt]=v;
        lk[rt]=v;
        rk[rt]=v;
        num[rt]=1;
        return ;
    }
    pushdown(rt);
    int m=(l+r)/2;
    if(m>=L) change(v,L,R,lson);
    if(m<R) change(v,L,R,rson);
    pushup(rt);
    return ;
}
//找出这段的个数和端点颜色
int query(int &lc,int &rc,int L,int R,int l,int r,int rt){
    if(L<=l&&R>=r){
        if(L==l) lc=lk[rt];
        if(R==r) rc=rk[rt];
        return num[rt];
    }
    pushdown(rt);
    int m=(l+r)/2;
    int ans=0;
    bool z=false,y=false;
    if(m>=L){
        ans+=query(lc,rc,L,R,lson);
        z=true;
    }
    if(m<R){
        ans+=query(lc,rc,L,R,rson);
        y=true;
    }
    pushup(rt);
    if(z&&y)
        ans-=rk[rt<<1]==lk[rt<<1|1];
    return ans;
}

//染色
void modify(int L,int R,int v)
{
    int f1=top[L],f2=top[R];
    while(f1!=f2)
    {
        if(depth[f1]<depth[f2])
        {
            swap(f1,f2);
            swap(L,R);
        }
        change(v,id[f1],id[L],1,n,1);
        L=fa[f1];
        f1=top[L];
    }
    if(depth[L]>depth[R]) swap(L,R);
    change(v,id[L],id[R],1,n,1);
}

//找段数
int solve(int L,int R)
{
    int f1=top[L],f2=top[R];
    int ans=0,lo=-1,ro=-1;
    while(f1!=f2)
    {
        if(depth[f1]<depth[f2]){
            int tb,tc;
            ans+=query(tb,tc,id[f2],id[R],1,n,1);
            if(tc==ro) ans--;
            ro=tb;
            R=fa[f2];
            f2=top[R];
        }
        else{
            int tb,tc;
            ans+=query(tb,tc,id[f1],id[L],1,n,1);
            if(tc==lo) ans--;
            lo=tb;
            L=fa[f1];
            f1=top[L];
        }
    }
    if(depth[L]>depth[R]){
        int tb,tc;
        ans+=query(tb,tc,id[R],id[L],1,n,1);
        if(tc==lo) ans--;
        if(tb==ro) ans--;
    }
    else{
        int tb,tc;
        ans+=query(tb,tc,id[L],id[R],1,n,1);
        if(tb==lo) ans--;
        if(tc==ro) ans--;
    }
    return ans;
}

int main(){
    init();
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++) scanf("%d",&val[i]);
    for(int i=0,u,v;i<n-1;i++){
        scanf("%d%d",&u,&v);
        addedge(u,v);
    }
    dfs1(1,1,1);
    dfs2(1,1);
    for(int i=1;i<=n;i++)
        rnk[id[i]]=i;
    build(1,n,1);
    while(q--){
        scanf("%s",ta);
        if(ta[0]=='Q'){
            int tb,tc;
            scanf("%d%d",&tb,&tc);
            printf("%d\n",solve(tb,tc));
        }
        else{
            int tb,tc,td;
            scanf("%d%d%d",&tb,&tc,&td);
            modify(tb,tc,td);
        }
    }
}
集成电路设计学习笔记(二)基于IC617反相器设计之原理图绘制 博主的博客网站 欢迎大家访问! ccbirds.cn ccbirds.github.io 本文主要记录在IC617中原理图的绘制和schematic的使用方法。 新建library 要画设计自己的集成电路,需要建一个自己的库,方便对自己设计文件的管理。 打开library manager,file 下NEW下Library 选择库的保存路径,一般默认即可,并在name中填入自己库的名字。... 阅读详情

相关推荐

实战指南:如何用Frida绕过某梆加固的Anti-Frida检测(附完整脚本)

本文深入剖析了企业级加固方案中的Anti-Frida检测机制,并提供了实战对抗策略。通过分析基于文件系统、内存特征、行为及环境的多层次检测原理,文章详细介绍了如何定位检测逻辑、绕过maps文件扫描、对抗内存与行为特征检测,并附上了针对某梆加固的完整绕过脚本与系统化工程方案。

weixin_42527589的博客 600

【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

【BZOJ2243】[SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。 请你写一个程序依次完成这m个操作。 Input 第一行包含2...

aodanchui1057的博客 159

从硅片到时钟:揭秘SiTime MEMS谐振子的精密制造之旅

本文深入解析了SiTime MEMS谐振子的精密制造工艺,从硅晶圆的提纯到DRIE深硅刻蚀,再到真空封装技术,揭示了其如何克服传统石英晶振的局限。通过对比测试数据,展示了MEMS谐振子在精度、可靠性和生产效率上的显著优势,特别是在5G基站和汽车电子等领域的应用潜力。

weixin_42522953的博客 403

[BZOJ2243][[SDOI2011]染色][树链剖分+线段树]

[BZOJ2243][[SDOI2011]染色][树链剖分+线段树]题目大意:给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。 请你写一个程序依次完成这m个操作。思路:树链剖分后在线段树上记录一下每个节点表示的区

羽裳 459

Ubuntu 22.04蓝牙开关秒关?别慌,可能是这个Intel固件文件在搞鬼

本文深入解析Ubuntu 22.04蓝牙开关秒关问题,指出Intel固件文件缺失是常见原因,并提供详细修复方案。通过确认硬件型号、检查固件文件及智能替代方案,帮助用户快速解决蓝牙故障,提升系统稳定性。

weixin_30247307的博客 755

平衡电桥在高压绝缘检测中的动态切换策略与误差优化

本文深入探讨了平衡电桥在高压绝缘检测中的动态切换策略与误差优化方法。通过分析四种基本切换模式及智能切换时序设计,显著提升检测精度与范围。结合电阻选型黄金法则和软件补偿技术,有效降低测量误差,为电动汽车电池管理系统提供可靠的安全保障。

weixin_30275415的博客 473

bzoj2243 染色 树链剖分

为了练手速我花了半个小时打完了这道题。。然后debug的时候就。。23333        首先如果是一个序列显然可以用线段树区间修改,维护段中的颜色数量,左右端点的颜色来做吧。        树上也一样,我们可以把树上的区间转化为dfs序列中若干个连续区间,然后用树链剖分使区间的个数(说白了就是一道树链剖分裸题)。 AC代码如下: #include #include #include #

lych的博客 592

bzoj 2243 染色 树链剖分 好题!

题意:中文题。 思路:很好的一道树链剖分。树剖后,线段树要记录左端点l,右端点r,左端点的颜色lc,右端点的颜色rc,区间成段更新的标记tag,区间 有多少颜色段。区间合并的时候要注意如果左子树的右端和右子树的左端颜色相同那么数量要减一。但是存在一个问题当前剖到 的链与上一次的链在相交的边缘可能颜色相同,如果颜色相同答案需要减一。所以统计答案的时候要记录下上一次剖到的链的左端 点的颜色,与

AC_kereo的专栏 3128

YOLO11改进-注意力-引入Deformable Large Kernel Attention (DLKA) 解决多尺度、小目标、遮挡等问题

Deformable Large Kernel Attention (DLKA) 是一种用于视觉任务的注意力机制,旨在提升模型在处理不同尺寸和形状对象时的灵活性和性能。DLKA 的设计灵感源自传统的注意力机制,但通过引入可变形核(deformable kernel)来增强对局部特征的适应能力。

qq_64693987的博客 4042

FineReport FCP模拟题五

新建决策报表,设置 移动端 格式,采用绝对布局。数据来源:FRDemo中的订单表/雇员表。

Davina_yu的博客 724

bzoj 2243 [SDOI2011]染色(树链剖分+线段树合并)

【bzoj2243】[SDOI2011]染色 2017年10月20日 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。 请你写一个程序依次完成这m个操作。 ...

weixin_30295091的博客 126

司法AI系统的架构设计:法律知识图谱如何辅助智能庭审?架构师亲测

简单来说,法律知识图谱是一种采用图数据结构(节点Node + 边Edge/关系Relation)来组织和表达法律领域知识的语义网络。它以。

AI 算法实战派 1088

bzoj2243染色 树链剖分+线段树

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 8230  Solved: 3073 [Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点

maxtir的博客 302

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

BZOJ 2243 染色 树链剖分+线段树

https://www.lydsy.com/JudgeOnline/problem.php?id=2243 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221”由3段组成:“11”、“222”和“1”。 请你写一个程序依次完成这m个操作。 Inpu...

xiji333的博客 343

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

BZOJ 2243: [SDOI2011]染色 树链剖分

Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。 请你写一个程序依次完成这m个操作。 Input 第一行包含2个整数n和m,分别表示节点数和操作数; 第二行包含n个正

I'm Growing 442

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

bzoj2243 染色 树链剖分 线段树

题目大意:C a b c 将a到b的路径上的点权覆盖为c Q a b 查询a到b的路径上有几段颜色 bzoj2243染色 树链剖分 写的不熟 注意细节#include<iostream> #include<cstdio> #define N 100005 using namespace std; struct E {int to,nxt;}edge[N*2]; struct T

yxr0105 491

BZOJ-2243: [SDOI2011]染色-树链剖分

http://www.lydsy.com/JudgeOnline/problem.php?id=2243 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“

缺氧 927

BZOJ - 2243: [SDOI2011]染色 树链剖分

2243: [SDOI2011]染色 Time Limit:20 SecMemory Limit:512 MBSubmit:10456Solved:4013[Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点...

diangan7073的博客 182

[SDOI2011] [BZOJ2243] 染色 - 树链剖分

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 5001  Solved: 1860 [Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点

whzzt的博客 492

bzoj 2243 树链剖分 染色

2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 3205  Solved: 1238 [Submit][Status][Discuss] Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜

hero_ds的专栏 406

【BZOJ 2243】【SDOI 2011】染色【树链剖分】

学会树链剖分后的一道练手题。>_<Description给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“112221”由3段组成:“11”、“222”和“1”。 请你写一个程序依次完成这m个操作。题解 若是你还不会树链剖分,请看这里  本题可以直接上 树链剖分+线段

cyclization的小栈 299

BZOJ 2243 染色 | 树链剖分模板题进阶版

BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了。 这道题要注意的是,无论是线段树上还是原树上,把两个区间的信息合并的时候,要注意中间相邻两个颜色是否相同。 这代码好长啊啊啊啊 幸好一次过了不然我估计永远也De不出来 #include <cstdio> #include ...

weixin_30346033的博客 95

BZOJ2243 【SDOI2011】染色 树链剖分

给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点x到节点y路径上所有点染色成颜色c 2、询问节点x到节点y路径上的颜色段数量

Elemmir的博客 645

BZOJ 2243 染色 树链剖分

题目大意:给定一棵树,树上的每个点有一个颜色

世界 1665

【树链剖分】BZOJ2243染色

题目大意:给定一棵有n个节点的无根树和m个操作,操作有2类: 1、将节点a到节点b路径上所有点都染成颜色c; 2、询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段), 如“112221”由3段组成:“11”、“222”和“1”。 请你写一个程序依次完成这m个操作。分析:其实并没有脱离最基础的树链剖分模板。 同样是树链剖分套线段树,线段树内储存当前区间的不同染色段的个数,以及

氧化钠的博客 342
上一篇: SPOJ QTREE3 Query on a tree again!(树链剖分)
下一篇: BZOJ 4034 树上操作(树链剖分)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值