首页 > 其他分享 >P3038 [USACO11DEC] Grass Planting G

P3038 [USACO11DEC] Grass Planting G

时间:2024-09-28 10:35:25浏览次数:1  
标签:idx int sum dep dfn P3038 USACO11DEC Grass top

题意

image

思路

我们可以使用树链剖分,将每条边的边权下放,将其当作点权处理,每次操作都要忽略 lca 那个点,因为它所对应的点并不在路径上。

image

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

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

int head[N], idx = 1;

void add(int u, int v) {
    idx++;
    e[idx].to = v;
    e[idx].next = head[u];
    head[u] = idx;
}

struct node {
    int sum, add;
} tr[N << 2];

void pushup(int u) {
    tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
}

void addtag(int u, int c, int l, int r) {
    tr[u].add += c;
    tr[u].sum += c * (r - l + 1);
}

void pushdown(int u, int l, int r) {
    if (tr[u].add) {
        int mid = l + r >> 1;
        addtag(u << 1, tr[u].add, l, mid);
        addtag(u << 1 | 1, tr[u].add, mid + 1, r);
        tr[u].add = 0;
    }
}

void modify(int u, int l, int r, int pl, int pr, int v) {
    if (pl <= l && r <= pr) {
        addtag(u, v, l, r);
        return;
    }
    pushdown(u, l, r);
    int mid = l + r >> 1;
    if (pl <= mid) modify(u << 1, l, mid, pl, pr, v);
    if (pr > mid) modify(u << 1 | 1, mid + 1, r, pl, pr, v);
    pushup(u);
}

int query(int u, int l, int r, int pl, int pr) {
    if (pl <= l && r <= pr) return tr[u].sum;
    pushdown(u, l, r);
    int mid = l + r >> 1, sum = 0;
    if (pl <= mid) sum += query(u << 1, l, mid, pl, pr);
    if (pr > mid) sum += query(u << 1 | 1, mid + 1, r, pl, pr);
    return sum;
}

int son[N], sz[N], fa[N], dep[N];

void dfs1(int u, int f) {
    sz[u] = 1, fa[u] = f, dep[u] = dep[f] + 1;
    for (int i = head[u]; i; i = e[i].next) {
        int to = e[i].to;
        if (to == f) continue;
        dfs1(to, u);
        sz[u] += sz[to];
        if (sz[son[u]] < sz[to]) son[u] = to;
    }
}

int top[N], dfn[N], rk[N], t_cnt;
int n, m;

void dfs2(int u, int t) {
    top[u] = t, dfn[u] = ++t_cnt, rk[t_cnt] = u;
    if (son[u]) dfs2(son[u], t);
    for (int i = head[u]; i; i = e[i].next) {
        int to = e[i].to;
        if (to == fa[u] || to == son[u]) continue;
        dfs2(to, to);
    }
}

void update(int u, int v) {
    while (top[u] != top[v]) {
        if (dep[top[u]] < dep[top[v]]) swap(u, v);
        modify(1, 1, n, dfn[top[u]], dfn[u], 1);
        u = fa[top[u]];
    }
    if (dep[u] > dep[v]) swap(u, v);
    if (u == v) return;
    modify(1, 1, n, dfn[u] + 1, dfn[v], 1);
}

int ask(int u, int v) {
    int sum = 0;
    while (top[u] != top[v]) {
        if (dep[top[u]] < dep[top[v]]) swap(u, v);
        sum += query(1, 1, n, dfn[top[u]], dfn[u]);
        u = fa[top[u]];
    }
    if (dep[u] > dep[v]) swap(u, v);
    if (u == v) return sum;
    sum += query(1, 1, n, dfn[u] + 1, dfn[v]);
    return sum;
}

void solve() {
    cin >> n >> m;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        add(u, v), add(v, u);
    }
    dfs1(1, 0);
    dfs2(1, 1);

    char opt;
    int x, y;
    while (m--) {
        cin >> opt >> x >> y;
        if (opt == 'P') update(x, y);
        else cout << ask(x, y) << '\n';
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    return 0;
}

标签:idx,int,sum,dep,dfn,P3038,USACO11DEC,Grass,top
From: https://www.cnblogs.com/Yuan-Jiawei/p/18437087

相关文章

  • 洛谷 P3119 Grass Cownoisseur G
    洛谷P3119GrassCownoisseurG题意约翰有\(n\)块草场,编号\(1\)到\(n\),这些草场由若干条单行道相连。奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草。贝西总是从\(1\)号草场出发,最后回到\(1\)号草场。她想经过尽可能多的草场,贝西在通一个草场只吃一次......
  • P3038 [USACO11DEC] Grass Planting G
    原题链接题解树上区间修改加单点查询,虽然可以树状数组,但是线段树更通用一点然而线段树通常处理的是点权,可这里是边权,怎么办呢?我们可以把边权转换成点权,由于每个点的子边有若干个,但父边有且只有一个,这样我们就把边权变成边下方点的点权然后区间修改和单点求和的时候把lca的点权......
  • Grass是什么,web3空投项目
    Grass是什么?项目介绍 Grass是一个Chrome浏览器插件,它将你用不到的带宽分享,并获取额外的奖励,是一种利用流量挂机赚取代币的新概念。根据官方资料,Grass最多只会使用0.3%的闲置网络资源,并不影响到正常的网络使用速度,也不会获取用户隐私和个人资料,后续网络资源会出售给那些经过W......
  • Web3系列之2-Grass小草撸Airdrop
    0、有wifi就能zuanqian,现在每积分0.003......
  • P3038 [USACO11DEC] Grass Planting G - 重链剖分
    本题可以说是板题P3384的弱化版,只不过要改的变成了边权边权很好处理,只需要将每个边的边权下放到两端点深度比较深的上面就好了(因为每个点连比它浅的节点必定只有一条边)。那么就将模板改一下就好了代码如下:#include<cstdio>usingnamespacestd;constintN=1e5+5;in......
  • P3119 [USACO15JAN] Grass Cownoisseur G 题解
    分析大概是强连通分量里面最水的一道紫题,不过细节挺多的,做题的时候给蒟蒻震惊到了。题目要求是从\(1\)走到某个点,然后再走回\(1\)号点,中途可逆行一次,问最多能经过几个点。有一个明显的思路是存两个图,一个正图一个反图,正图是为了求\(1\)到各个点的距离,反图是为了求各个点......
  • 使用 Amazon ECS Anywhere 在边缘部署 Amazon IoT Greengrass
    1.概述亚马逊云科技提供了完备的IoT服务能力,涵盖设备服务、连接和控制服务以及云端分析服务,是快速构建安全可靠、可扩展的IoT平台的常见选择。AmazonIoTGreengrass边缘运行时和云服务,可帮助您在设备上构建、部署和管理IoT应用。AmazonECSAnywhere提供的混合云容器服务。......
  • 如何使用 Amazon Systems Manager 集中管理 Amazon IoT Greengrass 设备
    对于边缘设备管理员来说,远程管理大量不同的系统和应用程序会是一项富有挑战性的任务。AmazonIoTGreengrass 可帮助这些系统管理员管理其边缘设备应用程序堆栈。不过,这些设备上的系统软件必须通过与其大型IT企业的运营策略一致的运营策略来单独更新和维护。此外,客户必须构建或......
  • NC24141 [USACO 2011 Dec G]Grass Planting
    题目链接题目题目描述FarmerJohnhasNbarrenpastures(2<=N<=100,000)connectedbyN-1bidirectionalroads,suchthatthereisexactlyonepathbetweenanytwopastures.Bessie,acowwholoveshergrazingtime,oftencomplainsabouthowthereisnogr......
  • 状态栏使用prograssBar
    privatestaticfinalintPROGRESS=0x1;privatestaticfinalintMAX_PROGRESS=100;privateintmProgressStatus=10;privateHandlermHandler=newHandler();@OverridepublicvoidonCreate(BundlesavedInstanceState){......