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);
        }
    }
}
AutoCAD2016安装破解教程 AutoCAD2016安装破解教程。本人亲自实验,破解成功,有效。以64位为例。 工具/原料   笔记本电脑 AutoCAD2016安装包 AutoCAD2016注册机(xf-adsk2016_x64.exe)链接:http://pan.baidu.com/s/1cAZQA windows7/8/8.1/10-32... 阅读详情

相关推荐

最新版IAR9.40和注册工具

IAR最新版的IDE在编译速度和代码提示等各个方面上都有很大提升,软件这个东西果然还是越新越好。之前的时候,IAR v9系列网上很多人都说能用,但是又没有把 IAR v9系列的注册方法写的很清楚,导致我一直都用注册老版本v8的方法去注册v9。结果注册后都会提示。

xue_nuo的博客 4万+

【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

泛微E8流程监控指南:如何用SQL实时追踪审批节点状态?

本文详细介绍了如何利用SQL实时监控泛微E8系统中的审批流程状态,包括核心数据表结构解析、全链路监控SQL实战以及智能预警机制设计。通过数据库直接查询和状态关联分析,帮助企业快速定位卡顿节点,提升流程效率。适用于需要优化OA系统流程管理的企业IT人员和业务主管。

weixin_30687051的博客 437

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

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

羽裳 459

【任何电机可使用的七段式s曲线-----包括matlab代码和simulink仿真】

S形加加速(T1)→>匀加速(T2)→减加速(T3)→>匀速(T4 )>加减速(T5)>匀减速(T6)-→>减减速(T7)

weixin_44312889的博客 6309

PyTorch 面试题及参考答案(精选100道)

模块是 PyTorch 中用于自动求导的核心模块。它为张量上的所有操作提供了自动求导的功能。在深度学习中,反向传播是一种用于计算损失函数相对于模型参数的梯度的算法。通过梯度,我们可以使用优化算法(如随机梯度下降)来更新模型的参数,从而最小化损失函数。模块的主要作用就是自动计算这些梯度。当我们创建一个张量时,如果将其属性设置为True,那么 PyTorch 会跟踪该张量上的所有操作。在完成前向传播计算出损失函数后,调用方法,模块会自动根据链式法则反向传播计算出所有需要求导的张量的梯度。

大模型大数据攻城狮的专栏 1681

bzoj2243 染色 树链剖分

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

lych的博客 592

iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决

问题现象 Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。 此时检查发现,并没有对App的内购逻辑做任何改动。 那么,这是什么原因导致的呢? Let’s find out!???? 问题分析 1. 排除其它原因 首先,你先得排除不是你IAP内购逻辑变更或其他原因导致的。 在SKProductsRequestDelegat代理实现的productsRequest方法里下断点: func produc

享受开发,颠倒银河 6141

bzoj 2243 染色 树链剖分 好题!

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

AC_kereo的专栏 3128

本文将详细介绍如何在 Qt (C++) 应用程序中集成 osgEarth,加载三维数字地球,并在指定经纬度添加三维模型(如飞机、建筑等)。

OSG 与 Qt 的交互通常需要处理 OpenGL 上下文。osgEarth 3.x 提供了对 Qt 的较好支持,或者可以使用。在普通 OSG 程序中,你需要手动处理坐标系转换将经纬度转为笛卡尔坐标 (XYZ)。这是实现的关键,将 OSG 的渲染循环集成到 Qt 的事件循环中。第三方库,但在本教程中,我们将展示一种通过继承。,将 Qt 的输入事件转换为 OSG 理解的。事件,这是实现交互(旋转地球、缩放)的基础。来嵌入 OSG 视图的标准方法。在这里我们初始化地球并添加模型。节点简化了这一过程。

qq_45859163的博客 1044

数学建模学习(75):全局敏感性分析Morris 方法

敏感性分析 (SA) 是分析不同应用条件下模型行为的基本实践。提出了许多 SA 技术,从简单的筛选方法到计算成本高昂的基于方差的方法。本篇内容我们通过将 Morris 方法来对模型进行分析。

全栈川川 1万+

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

TensorRT的安装:一步一步教会你如何安装TensorRT

TensorRT(Tensor Runtime)是由NVIDIA开发的一个用于深度学习推理(inference)优化的库,它可以在NVIDIA的GPU上加速神经网络模型的推理过程,从而提高模型的性能和效率。安装完成后,需要将CUDA的安装路径添加到系统环境变量中,以便系统能够找到CUDA的库文件。根据你安装的CUDA版本,将CUDNN的库文件复制到CUDA的安装目录中。要使用TensorRT,首先需要安装NVIDIA的CUDA和cuDNN库,并根据NVIDIA官方文档安装TensorRT。

Science prince的博客 2372

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值