luogu2486 [SDOI2011]染色

维护区间左颜色值,右颜色值,颜色段个数。

#include <iostream>
#include <cstdio>
using namespace std;
int n, m, uu, vv, ww, w[100005], wt[100005], qwq, idx[100005], hea[100005];
int cnt, dep[100005], siz[100005], son[100005], fa[100005], top[100005];
char ss[15];
struct Edge{
    int too, nxt;
}edge[200005];
struct SGT{
    int col[400005], lco[400005], rco[400005], tag[400005];
    void upd(int o, int lson, int rson){
        col[o] = col[lson] + col[rson];
        if(rco[lson]==lco[rson])    col[o]--;
        lco[o] = lco[lson];
        rco[o] = rco[rson];
    }
    void build(int o, int l, int r){
        if(l==r)    lco[o] = rco[o] = wt[l], col[o] = 1;
        else{
            int mid=(l+r)>>1;
            int lson=o<<1;
            int rson=lson|1;
            if(l<=mid)  build(lson, l, mid);
            if(mid<r)   build(rson, mid+1, r);
            upd(o, lson, rson);
        }
    }
    void pushDown(int o, int l, int r, int lson, int rson, int mid){
        col[lson] = col[rson] = 1;
        lco[lson] = rco[lson] = lco[rson] = rco[rson] = tag[o];
        tag[lson] = tag[rson] = tag[o];
        tag[o] = 0;
    }
    void update(int o, int l, int r, int x, int y, int k){
        if(l>=x && r<=y){
            col[o] = 1;
            lco[o] = rco[o] = tag[o] = k;
        }
        else{
            int mid=(l+r)>>1;
            int lson=o<<1;
            int rson=lson|1;
            if(tag[o])  pushDown(o, l, r, lson, rson, mid);
            if(x<=mid)  update(lson, l, mid, x, y, k);
            if(mid<y)   update(rson, mid+1, r, x, y, k);
            upd(o, lson, rson);
        }
    }
    int query(int o, int l, int r, int x, int y){
        if(l>=x && r<=y)    return col[o];
        else{
            int mid=(l+r)>>1;
            int lson=o<<1;
            int rson=lson|1;
            int ans=0;
            if(tag[o])  pushDown(o, l, r, lson, rson, mid);
            if(x<=mid)  ans += query(lson, l, mid, x, y);
            if(mid<y)   ans += query(rson, mid+1, r, x, y);
            if(x<=mid && mid<y && rco[lson]==lco[rson]) return ans-1;
            return ans;
        }
    }
    int queryCol(int o, int l, int r, int x){
        if(l==r)    return lco[o];
        else{
            int mid=(l+r)>>1;
            int lson=o<<1;
            int rson=lson|1;
            if(tag[o])  pushDown(o, l, r, lson, rson, mid);
            if(x<=mid)  return queryCol(lson, l, mid, x);
            else    return queryCol(rson, mid+1, r, x);
        }
    }
}sgt;
void add_edge(int fro, int too){
    edge[++cnt].nxt = hea[fro];
    edge[cnt].too = too;
    hea[fro] = cnt;
}
void dfs1(int x, int f){
    dep[x] = dep[f] + 1;
    siz[x] = 1;
    fa[x] = f;
    int maxSon=-1;
    for(int i=hea[x]; i; i=edge[i].nxt){
        int t=edge[i].too;
        if(t!=f){
            dfs1(t, x);
            siz[x] += siz[t];
            if(maxSon<siz[t])   maxSon = siz[t], son[x] = t;
        }
    }
}
void dfs2(int x, int topf){
    top[x] = topf;
    idx[x] = ++qwq;
    wt[qwq] = w[x];
    if(!son[x]) return ;
    dfs2(son[x], topf);
    for(int i=hea[x]; i; i=edge[i].nxt){
        int t=edge[i].too;
        if(t!=fa[x] && t!=son[x])
            dfs2(t, t);
    }
}
void changeRange(int uu, int vv, int ww){
    while(top[uu]!=top[vv]){
        if(dep[top[uu]]<dep[top[vv]])   swap(uu, vv);
        sgt.update(1, 1, n, idx[top[uu]], idx[uu], ww);
        uu = fa[top[uu]];
    }
    if(dep[uu]>dep[vv]) swap(uu, vv);
    sgt.update(1, 1, n, idx[uu], idx[vv], ww);
}
int queryRange(int uu, int vv){
    int ans=0, orz, sto;
    while(top[uu]!=top[vv]){
        if(dep[top[uu]]<dep[top[vv]])   swap(uu, vv);
        ans += sgt.query(1, 1, n, idx[top[uu]], idx[uu]);
        orz = sgt.queryCol(1, 1, n, idx[top[uu]]);
        sto = sgt.queryCol(1, 1, n, idx[fa[top[uu]]]);
        if(orz==sto)    ans--;
        uu = fa[top[uu]];
    }
    if(dep[uu]>dep[vv]) swap(uu, vv);
    ans += sgt.query(1, 1, n, idx[uu], idx[vv]);
    return ans;
}
int main(){
    cin>>n>>m;
    for(int i=1; i<=n; i++) scanf("%d", &w[i]);
    for(int i=1; i<n; i++){
        scanf("%d %d", &uu, &vv);
        add_edge(uu, vv);
        add_edge(vv, uu);
    }
    dfs1(1, 0);
    dfs2(1, 1);
    sgt.build(1, 1, n);
    while(m--){
        scanf("%s", ss);
        if(ss[0]=='C'){
            scanf("%d %d %d", &uu, &vv, &ww);
            changeRange(uu, vv, ww);
        }
        else{
            scanf("%d %d", &uu, &vv);
            printf("%d\n", queryRange(uu, vv));
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/poorpool/p/8313091.html

数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值