[USACO11DEC] 牧草种植Grass Planting

https://www.luogu.org/problemnew/show/3038

将为边加权转化成为点加权

对于每条边,我们将其深度更大的端点加权,则区间 [l, r] 的加权(或询问)即为去掉深度最小的点,给其余点加权(或询问)。

1)最后一次树剖查询时,当前两点 x,y 必定在同一重链上(y 的深度小于 x);

2)根据处理前的 dfs 序,我们是优先遍历重儿子,那么重儿子在线段树中的编号一定紧邻其父节点(即为其父节点编号 + 1),则我们要忽略深度最小的那个点 y ,即为处理区间 [ y 在线段树中的编号 + 1, x 在线段树中的编号](另外还要注意的是,y = x 时在线段树内执行会出错,我们要特判这种情况) 。

#include <bits/stdc++.h>

using namespace std;
const int N = 1e5 + 10;

#define gc getchar()
#define lson jd << 1
#define rson jd << 1 | 1 

struct Node_1{
    int v, nxt;
}G[N << 1];
struct Node_2{
    int fa, son, deep, topp, siz, tree;
}P[N];
struct Node_3{
    int l, r, w, f;
}T[N << 2];
int n, Ti, now = 1, head[N], tim, ans;

inline int read(){
    int x = 0; char c = gc;
    while(c < ‘0‘ || c > ‘9‘) c = gc;
    while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = gc;
    return x;
}

inline void add(int u, int v){
    G[now].v = v;
    G[now].nxt = head[u];
    head[u] = now ++;
}

void dfs_find_son(int u, int fa, int dep){
    P[u].fa = fa;
    P[u].deep = dep;
    P[u].siz = 1;
    for(int i = head[u]; ~ i; i = G[i].nxt){
        int v = G[i].v;
        if(v != fa){
            dfs_find_son(v, u, dep + 1);
            P[u].siz += P[v].siz;
            if(P[v].siz > P[P[u].son].siz) P[u].son = v;
        }
    }
}

void dfs_to_un(int u, int tp){
    P[u].topp = tp;
    P[u].tree = ++ tim;
    if(!P[u].son) return ;
    dfs_to_un(P[u].son, tp);
    for(int i = head[u]; ~ i; i = G[i].nxt){
        int v = G[i].v;
        if(v != P[u].son && v != P[u].fa) dfs_to_un(v, v);
    }
}

void down(int jd){
    int F = T[jd].f;
    T[lson].w += (T[lson].r - T[lson].l + 1) * F; T[lson].f += F;
    T[rson].w += (T[rson].r - T[rson].l + 1) * F; T[rson].f += F;
    T[jd].f = 0;
}

void Sec_G(int l, int r, int jd, int x, int y){
    if(x <= l && r <= y){
        int yj = r - l + 1;
        T[jd].w += yj;
        T[jd].f ++;
        return ;
    }
    if(T[jd].f) down(jd);
    int mid = (l + r) >> 1;
    if(x <= mid) Sec_G(l, mid, lson, x, y);
    if(y > mid) Sec_G(mid + 1, r, rson, x, y);
}

void Sec_G_imp(int x, int y){
    int tp1 = P[x].topp, tp2 = P[y].topp;
    while(tp1 != tp2){
        if(P[tp1].deep < P[tp2].deep) swap(x, y), swap(tp1, tp2);
        Sec_G(1, n, 1, P[tp1].tree, P[x].tree);
        x = P[tp1].fa;
        tp1 = P[x].topp;
    }
    if(x == y) return ;
    if(P[x].deep > P[y].deep) swap(x, y);
    Sec_G(1, n, 1, P[x].tree + 1, P[y].tree);
}

void build_tree(int l, int r, int jd){
    T[jd].l = l; T[jd].r = r;
    if(l == r) return ;
    int mid = (l + r) >> 1;
    build_tree(l, mid, lson);
    build_tree(mid + 1, r, rson);
}

void Sec_A(int l, int r, int jd, int x, int y){
    if(x <= l && r <= y){
        ans += T[jd].w;
        return ;
    }
    if(T[jd].f) down(jd);
    int mid = (l + r) >> 1;
    if(x <= mid) Sec_A(l, mid, lson, x, y);
    if(y > mid) Sec_A(mid + 1, r, rson, x, y);
}

int Sec_A_imp(int x, int y){
    int ret = 0;
    int tp1 = P[x].topp, tp2 = P[y].topp;
    while(tp1 != tp2){
        if(P[tp1].deep < P[tp2].deep) swap(x, y), swap(tp1, tp2);
        ans = 0;
        Sec_A(1, n, 1, P[tp1].tree, P[x].tree);
        ret += ans;
        x = P[tp1].fa;
        tp1 = P[x].topp;
    }
    if(x == y) return ret;
    ans = 0;
    if(P[x].deep > P[y].deep) swap(x, y);
    Sec_A(1, n, 1, P[x].tree + 1, P[y].tree);
    ret += ans;
    return ret;
}

int main()
{
    n = read(); Ti = read();
    for(int i = 1; i <= n; i ++) head[i] = -1;
    for(int i = 1; i < n; i ++) {
        int u = read(), v = read();
        add(u, v); add(v, u);
    }
    dfs_find_son(1, 0, 1);
    dfs_to_un(1, 1);
    build_tree(1, n, 1);
    while(Ti --){
        string s; cin >> s;
        int x = read(), y = read();
        if(s[0] == ‘P‘) Sec_G_imp(x, y);
        else cout << Sec_A_imp(x, y) << endl;

    }
    return 0;
}
时间: 2024-11-05 22:49:28

[USACO11DEC] 牧草种植Grass Planting的相关文章

P3038 [USACO11DEC]牧草种植Grass Planting

P3038 [USACO11DEC]牧草种植Grass Planting 题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional roads, such that there is exactly one path between any two pastures. Bessie, a cow who loves her grazing time, often compl

AC日记——[USACO11DEC]牧草种植Grass Planting 洛谷 P3038

题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional roads, such that there is exactly one path between any two pastures. Bessie, a cow who loves her grazing time, often complains about how there is no grass on t

【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】

模拟题,可以用树链剖分+线段树维护. 但是学了一个厉害的..树状数组的区间修改与区间查询.. 分割线里面的是转载的: -------------------------------------------------------------------------------- [ 3 ]  上面都不是重点--重点是树状数组的区间修改+区间查询 这个很好玩 其实也挺简单 首先依旧是引入delta数组 delta[i]表示区间 [i, n] 的共同增量 于是修改区间 [l, r] 时修改 delt

[USACO11DEC]Grass Planting

题目大意: 有一棵结点个数为n的树,有m个操作,可以将一段路径上每条边的权值+1或询问某一个边的权值. 思路: 树链剖分+线段树. 轻重链划分本身比较简单,主要需要思考如何用线段树维护每条链. 当x,y不在同一条链上时,先处理深度大的链,对于每一个链,建立一棵动态开点的线段树,用一个数组len顺序记录每一条边在链中的编号,然后维护len[x]+1到len[top[x]]这一区间的权值即可. 处理轻边时,可以直接用一个数组保存它的权值. 因为轻重边肯定是交替的,因此每次循环都可以先维护一个重边,再

树链剖分详解

前言 树链剖分是什么? 树链剖分,说白了就是一种让你代码不得不强行增加1k的数据结构-dms 个人理解:+1:joy: 有什么用? 证明出题人非常毒瘤 可以非常友(bao)好(li)的解决一些树上问题:grimacing: (友情提示:学树链剖分之前请先掌握线段树) 核心思想 树链剖分的思想比较神奇 它的思想是:把一棵树拆成若干个不相交的链,然后用一些数据结构去维护这些链 那么问题来了 如何把树拆成链? 首先明确一些定义 重儿子:该节点的子树中,节点个数最多的子树的根节点(也就是和该节点相连的点

树链剖分(从入门到入土。)

前置知识:线段树,链式前向星,LCA,DFS序 树链剖分通常的操作: 1.x -> y 的路径上修改 2.x -> y 的路径上查询 3. 对于 x 的子树修改 4.对于 x 的子树查询. 一般还有换根操作.树剖也也可以做LCA. 树链剖分有两个DFS 这两个DFS就是把一棵树变成一个序列. 然后就可以用数据结构来维护了. 第一个DFS 用来求 \(fa\)(祖先节点) \(size\)(子树大小)\(son\)(重儿子) \(d\)(深度) 重儿子指的是\(size\)较大的儿子节点. 第二

注册制为国产奶粉正名,但迎来“春天”仍任重道远

日前,被誉为"史上最严奶粉新政"的婴幼儿配方奶粉注册制首批名单正式出炉,婴幼儿奶粉再次刷屏-- 83:38,国产奶粉逆袭打了个翻身仗? 国家食药检总局分相继分批次公布了婴幼儿配方乳粉产品配方注册获批名单,截止目前,包括飞鹤奶粉在内,总共28家企业的121个婴幼儿配方乳粉产品配方获批.综合注册名单,国产品牌有83个配方获批,进口品牌则只有38个.其中,飞鹤旗下"星飞帆"."臻爱非帆"."星阶优护"三个系列婴幼儿配方乳粉产品首批通

国产奶粉的“春天”即将到来

2016年6月8日,国家食药监总局发布了<婴幼儿配方乳粉产品配方注册管理办法>(以下简称<办法>).<办法>明确规定,我国境内生产销售和进口的婴幼儿配方乳粉产品配方均实行注册管理,并严格限定申请人资质条件,每个企业原则上不得超过3个配方系列9种产品配方. 很多人认为,即将于10月1日起正式施行的<办法>将婴幼儿奶粉的配方管理升至药品监管级别,将提升婴幼儿配方乳粉行业准入门槛,配方.品牌乱象将有较大改善,品牌集中度进一步提升,市场竞争环境更加趋于良性,有利于形

洛谷——P3119 [USACO15JAN]草鉴定Grass Cownoisseur

P3119 [USACO15JAN]草鉴定Grass Cownoisseur 题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-way cow paths all over his farm. The farm consists of N fields, conveniently numbered 1..N, with each one-way co