线段树yy(线段树维护括号序列+LCA)

零代码搭建专业知识库:Wiki.js+cpolar让团队协作像写笔记一样简单 "项目文档又找不到了!“团队负责人小张第N次在群里看到这样的抱怨——技术文档分散在邮件、网盘和个人电脑里,新人入职要花一周熟悉文档位置,远程协作时版本混乱更是家常便饭。Wiki.js与cpolar内网穿透服务的出现,就像给团队协作装上了"中央大脑”,用写Markdown笔记的简单方式,搭建一个专业的知识库系统。普通人对知识管理的需求其实很简单:方便记录、容易查找、大家能用。但传统方案把这个过程搞得异常复杂:建服务器、配环境、学语法、搞权限……大部分团队还没开始就放弃了。 阅读详情

没有题目链接

一颗有 n 个节点的树,q 组询问,支持两种操作:1.单点修改 2.路径求和。(1 <= n, Q <= 1e5)

题解:

用 dfs 建出树的括号序列(好像也叫欧拉序),用基本的线段树维护这个括号序列,每个点在括号序列中为左括号时在线段树中加上该点权值,为右括号的位置减去该点权值,那么在一条路径中从起始点左括号到终点左括号一定包含路径中的每个点,并且不包含不再路径中的点(加了一次后又减去了)。

那么可以建立一颗有根树,每次更新时为两个单点更新(加一次减一次),每次查询时则是查询 根的左括号到 x 点的左括号之和 + 根的左括号到 y 点的左括号之和 - 2 * 根的左括号到 x 与 y 的 LCA 的左括号之和 + x 与 y 的 LCA 的权值。

由于没有交题的地方,就自己写了个对拍程序QAQ,和一位大佬的代码对拍。(附上源代码和对拍程序,如有错误欢迎指出)

对拍结果 100% 的代码:

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
#define int ll
#define PI acos(-1.0)
#define INF 0x3f3f3f3f3f3f3f3f
#define P pair<int, int>
#define fastio ios::sync_with_stdio(false), cin.tie(0)
const int mod = 998244353;
const int M = 1000000 + 10;
const int N = 100000 + 10;

int n, q;
int val[N];
vector<int> G[N];
int dfn[N<<1], cnt;
int dep[N], gfa[40][N];
int segtr[N<<3], add[N], sub[N];

void dfs(int now, int f)
{
    gfa[0][now] = f;
    dfn[++cnt] = val[now];
    add[now] = cnt;
    for(int i = 0; i < G[now].size(); i ++) {
        if(G[now][i] == f) continue;
        dep[G[now][i]] = dep[now] + 1;
        dfs(G[now][i], now);
    }
    dfn[++cnt] = -val[now];
    sub[now] = cnt;
}

void build(int l, int r, int rt)
{
    if(l == r) {
        segtr[rt] = dfn[l];
        return ;
    }

    int mid = (l + r) >> 1;
    build(l, mid, rt << 1);
    build(mid + 1, r, rt << 1 | 1);

    segtr[rt] = segtr[rt << 1] + segtr[rt << 1 | 1];
}

void update(int pos, int c, int l, int r, int rt)
{
    if(l == r) {
        segtr[rt] = c;
        return ;
    }

    int mid = (l + r) >> 1;
    if(pos <= mid) update(pos, c, l, mid, rt << 1);
    else update(pos, c, mid + 1, r, rt << 1 | 1);

    segtr[rt] = segtr[rt << 1] + segtr[rt << 1 | 1];
}

int query(int L, int R, int l, int r, int rt)
{
    if(L <= l && r <= R) return segtr[rt];

    int mid = (l + r) >> 1, ans = 0;
    if(L <= mid) ans += query(L, R, l, mid, rt << 1);
    if(mid < R) ans += query(L, R, mid + 1, r, rt << 1 | 1);
    return ans;
}

int lca(int u, int v)
{
    if(dep[u] > dep[v]) swap(u, v);
    for(int k = 0; k < 32; k ++) {
        if((dep[v] - dep[u]) >> k & 1)
            v = gfa[k][v];
    }
    if(u == v) return u;
    for(int k = 31; k >= 0; k --) {
        if(gfa[k][u] != gfa[k][v]) {
            u = gfa[k][u];
            v = gfa[k][v];
        }
    }
    return gfa[0][u];
}

signed main()
{
    fastio;
    freopen("in.in", "r", stdin);
    freopen("txb.out", "w", stdout);
    cin >> n;
    for(int i = 1; i <= n; i ++) cin >> val[i];
    for(int i = 1, u, v; i <= n - 1; i ++) {
        cin >> u >> v;
        G[u].push_back(v);
        G[v].push_back(u);
    }

    dep[1] = 1;
    dfs(1, -1);
    build(1, cnt, 1);
    for(int k = 0; k + 1 < 32; k ++) {
        for(int v = 1; v <= n; v ++) {
            if(gfa[k][v] == -1) gfa[k+1][v] = -1;
            else gfa[k+1][v] = gfa[k][gfa[k][v]];
        }
    }

    cin >> q;
    for(int i = 1, x, y; i <= q; i ++) {
        char op;
        cin >> op >> x >> y;
        if(op == 'C') {
            val[x] = y;
            update(add[x], y, 1, cnt, 1);
            update(sub[x], -y, 1, cnt, 1);
        } else {
            int xylca = lca(x, y), ans = 0;
            ans += query(1, add[x], 1, cnt, 1);
            ans += query(1, add[y], 1, cnt, 1);
            ans -= 2 * query(1, add[xylca], 1, cnt, 1);
            ans += val[xylca];
            cout << ans << endl;
        }
    }
    return 0;
}

/*

  Rejoicing in hope, patient in tribulation.

*/

随机生成数据程序:(数据量都是1e5)

#include <bits/stdc++.h>
using namespace std;

int n, m, q, a[10010];
pair<int, int> e[1000005];  // 无向图,连通,不含重边、自环
map< pair<int, int>, bool > h;

int random(int n) {
    return (long long)rand() * rand() % n;
}

signed main()
{
    srand((unsigned)time(0));
    freopen("in.in", "w", stdout);
    n = 100000, m = 100000, q = 100000;
    for (int i = 1; i <= n; i++) {
        a[i] = random(m) + 1;
    }
    for (int i = 1; i < n; i++) {
        int fa = random(i) + 1;
        e[i] = make_pair(fa, i + 1);
        h[e[i]] = h[make_pair(i + 1, fa)] = 1;
    }

    cout << n << endl;
    for(int i = 1; i <= n; i ++) cout << a[i] << " ";
    cout << endl;

    for(int i = 1; i <= n - 1; i ++) {
        cout << e[i].first << " " << e[i].second << endl;
    }

    cout << q << endl;
    for(int i = 1; i <= q; i ++) {
        int id = random(2), x, y;
        if(id == 0) {
            cout << "C ";
            x = random(n) + 1, y = random(m) + 1;
        }
        else {
            cout << "A ";
            x = random(n) + 1, y = random(n) + 1;
        }
        cout << x << " " << y << endl;
    }

    return 0;
}

判题程序:

#include <bits/stdc++.h>
using namespace std;

int main() {
    for (int T = 1; T <= 20; T++) {
        system("G:\\save\\judge\\random.exe");
        clock_t st,ed;
        st = clock();
        system("G:\\save\\judge\\txb.exe");
        ed = clock();
        system("G:\\save\\judge\\cy.exe");
        if (system("fc G:\\save\\judge\\txb.out G:\\save\\judge\\cy.out")) {
            printf("Wrong Answer on test %d", T);
            return 0;
        }
        else {
            printf("Accepted, 测试点 #%d, 用时 ", T); cout << ed - st << "ms" << endl;
        }
    }
}

 

智能车学习日记【二】————十字和斜入十字 智能车学习日记【二】————十字和斜入十字 文章目录 智能车学习日记【二】————十字和斜入十字 前言 一、普通十字补线 二、斜入十字 1.判断是否为斜入十字和斜入十字类型 2.找斜入十字拐点 总结 前言 经过了一个多月的学习,小白的我终于也是能较稳定调出了2.8m以上的四轮车,过程中也遇到了很多困难,其中就有十字补线和斜入十字补线。尤其是斜入十字也是困扰了我快一周,现在和大家分享一下我处理斜入十字的方法(我的方法其实还有很多漏洞需要改进,仅供大家参考理解一下,欢迎各位在评论区指点出可 阅读详情

相关推荐

华三(H3C)网络设备配置命令大全与学习指南

本文全面介绍 H3C 网络设备的配置命令,涵盖路由器、交换机、ACL、NAT、VTY、SSH、本地用户、日志、STP、防火墙、QoS 等模块,适合网络工程初学者与运维人员参考。

DreamCollector的博客 6562

LCA 三种 解决方法讲解 (附加例题)

LCA(Least Common Ancestors)   即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先)。 一、在线算法ST算法     所谓在线即输入一个询问,要立即返回答案,才可进行下一次询问。    基础:dp(即rmq)    时间复杂度O(nlogn+m+n)  步骤: 1.将树看作一个无向图,

Cynthia_wjyi 4975

别再手动画柜子了!用EPLAN导入STEP模型,5分钟搞定一个标准机柜

本文详细介绍了如何利用EPLAN Pro Panel的3D布局功能,快速将STEP模型转化为智能机柜宏,大幅提升电气工程设计效率。通过实战步骤解析,包括模型导入、智能解析、安装面定义及拼柜技巧,帮助工程师5分钟内完成标准机柜设计,避免传统手动建模的尺寸偏差问题。

weixin_26875109的博客 431

Codeforces Round #603 (Div. 2) E. Editor 线段树维护括号序列

传送门 文章目录题意:思路: 题意: 思路: 首先一个括号序列合法的条件可以转化成两个(左括号代价为111,右括号代价为−1-1−1): (1) 左括号个数等于右括号个数。 (2) 括号的前缀和非负。 所以我们直接用线段树维护一个前缀和序列,维护一下最小值即可。要输出的最大嵌套数就是前缀和的最大值,再维护一个最大值即可。 //#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string&

m0_51068403的博客 233

别再手动调波形了!用STM32G474的HRTIM+DAC生成精密锯齿波,附完整CubeMX配置

本文详细介绍了如何利用STM32G474的高分辨率定时器(HRTIM)和数模转换器(DAC)协同工作,实现高精度锯齿波生成。通过CubeMX配置指南、关键寄存器计算和实践技巧,帮助开发者快速掌握全硬件实现的波形生成方案,显著提升嵌入式系统的波形控制精度和响应速度。

weixin_28716769的博客 246

Unity动画状态机实战:Trigger和Bool参数到底怎么选?附5个常见场景解析

本文深入解析Unity动画状态机中Trigger和Bool参数的核心差异与应用场景。通过对比两者在描述瞬时事件与持续状态上的本质区别,并结合角色移动、攻击连招、跳跃落地、受击死亡及环境交互等5个实战场景,提供了清晰的选择逻辑与避坑指南,帮助开发者构建更健壮、易维护的动画逻辑。

weixin_29009501的博客 120

bzoj1095 线段树括号序列

题目分析首先%%% 岛姐的讲解 然后%%% hzwer的代码 最后%%% 树王的帮助 好吧,写写我的感悟。括号序列与距离首先我们对于一棵美丽的树,可以生成一个先序遍历的括号序列,左括号表示到达该店,右括号表示离开该点。例如下图这棵美丽的树,可以生成一个这样的序列:(1(2(3)(5))(4)(6(7))) 这个序列有什么用呢?两个点之间的距离,就是它们之间括号序列去掉可以匹配的括号后的括

litble的成(tui)长(fei)史 834

从零到一:手把手教你用Python搭建医学影像识别CNN模型(附完整代码)

本文详细介绍了如何使用Python和TensorFlow/Keras从零开始构建一个医学影像识别的CNN模型,涵盖数据预处理、模型架构设计、训练调优及部署全流程。通过实战案例和完整代码,帮助开发者快速掌握深度学习在医学影像识别中的应用,特别适合医疗AI领域的初学者和研究者。

spark7igniter的博客 200

蓝桥杯-翻转括号序列(线段树)

蓝桥杯-翻转括号序列(线段树) 题目描述 给定一个长度为n的括号序列,要求支持两种操作: 将[Li,Ri][L_i,R_i][Li​,Ri​]区间内(序列中的第LiL_iLi​个字符到第RiR_iRi​个字符)的括号全部翻转(左括号变成右括号,右括号变成左括号)。 求出以L为左端点时,最长的合法括号序列对应的R(即找出最大的R使[Li,R]是一个合法括号序列)。 输入描述 输入的第一行包含两个整数n, m,分别表示括号序列长度和操作次数。 第二行包含给定的括号序列,括号序列中只包含左括号和右括号。 接下

addmission的博客 1690

在Simulink中实现一个基于SiC MOSFET的高效率电机驱动系统

本文介绍了在Simulink中构建基于SiC MOSFET的高效率电机驱动系统的详细流程。系统由直流电源模块、SiC MOSFET逆变器模块、PMSM电机模型、控制策略模块(包括矢量控制和PWM生成)以及反馈测量模块组成。文章逐步指导了从模型创建到参数设置的完整过程,包括各模块的具体实现方法。通过仿真可以评估系统在不同负载条件下的响应速度、效率、功率密度等性能指标。该建模方法为电机驱动系统的设计和优化提供了有效工具,同时建议根据实际硬件规格和工程需求进行参数调整和定制化开发。

xiaoheshang_123的博客 248

硅基半导体量子点:单电子自旋量子比特技术手册

现在我们已经了解了从硅片到容错计算的全部环节,让我们用一张总览图把碎片拼成完整拼图。fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;important;important;important;color:#000!important;important;important;important;important;color:#000!

VectorShift的博客 367

29.CF1149C [Tree Generator™](httpswww.luogu.com.cnproblemCF1149C) 区间合并线段树

给定一棵树的括号序列,要求支持单点修改、查询树直径 考虑区间合并线段树,每个子树的括号序列是按照先序遍历进行的,因此考虑合并两个区间的括号序列时的情况 若从序列中任取一段连续子序列,从中去掉所有匹配括号后,剩下的括号组成的路径一定为一条链,链长为剩下的子序列 树上直径长度即为任意区间去掉匹配括号后的长度的最大值。 最长去匹配区间 = 最大的(将区间分成两段)后面的权值和 - 前面的权值和

HeartFireY的博客 556

【Java基础篇】Java重要特性,JDK,JRE,JVM区别和联系,环境变量

JDK使用时的执行流程: • 开发者视角(需要开发java程序):需要安装JDK a. 首先使用JDK调用Tools&Tool APIs(开发者工具)编写好Java程序--xxx.java b. 再次调用Tools&Tool APIs中的javac.exe(编译程序)来编译.java文件(将java文件编译成字节码.class文件) c. 调用java.exe来启动JRE d. 在JRE上运行JAVA字节码(加载特定的.class文件,调用这个class文件中的main方法

Yaoyao2024的博客 2163

BSOJ2381:捉迷藏 括号序列 线段树维护

解释有部分来自某论文,代码改自hzwer 2381 -- 【ZJOI2007】捉迷藏 Description   Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子。某天,Jiajia、Wind和孩子们决定在家里玩捉迷藏游戏。他们的家很大且构造很奇特,由N个屋子和N-1条双向走廊组成,这N-1条走廊的分布使得任意两个屋子都互相可达。   游戏是这样进

.. 571

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【BZOJ1095】【ZJOI2007】捉迷藏 括号序列+线段树维护

原题链接 1095: [ZJOI2007]Hide 捉迷藏 Time Limit: 40 Sec  Memory Limit: 162 MB Submit: 2109  Solved: 868 [Submit][Status][Discuss] Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子。某天,Jiajia、Wind和孩子们决

function2的博客 2511

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

BZOJ1095: [ZJOI2007]捉迷藏 【树上距离->括号序列+线段树】

题解戳这里 #include<cstdio> #include<cctype> #include<algorithm> #define maxn 300005 #define LL long long using namespace std; char cb[1<<15],*cs,*ct; #define getc() (cs==ct&&am...

Master.Yi的博客 294

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【hdu5217-括号序列】线段树

【hdu5217-括号序列】线段树 题意:给一串括号,有2个操作,1。翻转某个括号。2。查询某段区间内化简后第k个括号是在原序列中的位置。1≤N,Q≤200000. 题解: 可以知道,化简后的序列一定是)))((((这种形式的。 线段树每个节点就存对应区间内化简后的ls也就是)的数量,rs也就是(的数量。 然后我先把区间[l,r]找...

qq_25768269的博客 289

Codeforces1263 E. Editor(线段树维护括号序列前缀)

题意: 输入格式:

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 292

bzoj 1095(括号序列)

传送门 括号序列:访问到一个点时,加入’(‘,再加入该点编号,访问完这个点及其子树退出时加入’)’ 括号序列有一个神奇的性质:任意两点间的距离即为括号序列中将它们之间可匹配的括号全部消去后,剩下的括号的数量。为什么呢???把序列中可以匹配的括号消去后,剩余的括号肯定是”)))…..)(……(((“这样的。’)’的个数就是x到lca(x,y)的距离,’(‘的个数就是y到lca(x,y)的距离。用线

KGV093的博客 500

【codeforces 1095E - Almost Regular Bracket Sequence】【线段树】【前缀和】【括号匹配】

https://codeforces.com/problemset/problem/1095/E 【题意】 问有多少的个位置,更换一个括号,就能使括号匹配 【思路】 线段树维护。 遍历每一个位置,单点修改。建一棵线段树,树上节点维护两个信息:左括号数,右括号数 区间合并: 假设左儿子为:))(((,右儿子为:))(((,合并消除()之后就变成了))(((( 所以我可以从1枚举到n,...

running_acmer的博客 403

CF里面的一些线段树题目

Sereja has a bracket sequence $ s_{1},s_{2},…,s_{n} $ , or, in other words, a string $ s $ of length $ n $ , consisting of characters “(” and “)”.Sereja needs to answer $ m $ queries, each of them is described by two integers $ l_{i},r_{i} $ $ (1

重生之我是cxk的博客 328

【训练题56:括号序列 + 线段树】Sereja and Brackets | CF380C

题意 Sereja and Brackets | CF380C 200020002000 分 给定一个长度为 nnn 的括号序列 S[1,n]S[1,n]S[1,n] 有 mmm 个询问,每次询问 [Li,Ri][L_i,R_i][Li​,Ri​] 的最长合法括号序列的长度是多少 1≤n≤1061\le n\le 10^61≤n≤106 1≤m≤1051\le m\le 10^51≤m≤105 思路 这居然是线段树的题?虽然题面非常的模板,但是仍然令人意想不到… 一开始,考虑莫队,或者权值线段树(让左

溢流眼泪的博客 408

【平衡树维护括号序列】CC_ANUDTQ Dynamic Trees and Queries

【题目】 Codechef 给定一棵nnn个点的有根树,每个节点都有一个权值,支持以下操作: 插入一个节点(作为树上一个节点的儿子) 删除一个子树 子树加 子树求和 n,Q≤105n,Q\leq 10^5n,Q≤105,强制在线。 【解题思路】 这个动态加入叶子还要提出子树就很自闭。 不过稍加分析,我们在平时处理问题的时候,都是将子树信息通过DFS\text{DFS}DFS序转到序列上的。当然...

MEET YOU FIRST TIME 544

[LCT || splay维护括号序列] BZOJ 4573 [Zjoi2016]大森林

题解爸爸戳这里splay维护括号序实在不敢尝试 建虚点LCT 还是很资瓷的哇 正如dls所说的 小清新数据结构 注意的是求两点距离 不能直接拉出那条链 而是要求LCA 然后我发现我不会求LCA了#include<cstdio> #include<cstdlib> #include<algorithm> #include<stack> using namespace std;inline ch

雯舞 814

UESTC-1546___Bracket Sequence —— 线段树 + 括号序列

题目链接:点我啊╭(╯^╰)╮ 题目大意: &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 给出一个括号序列 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setsetset —— 将给定区间全部转化为指定括号 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reversereversereverse —— 将

Scar_Halo 476

Codeforces1263E Editor (线段树 + 括号序列)

题目链接: Editor 大致题意 给出一系列操作, 问每次操作结束后, 括号能否正确匹配. 若可以, 则输出最大匹配深度, 否则输出-1. 解题思路 线段树 很经典的线段树区间合并处理括号匹配问题. 关于线段树的括号匹配问题, 目前我知道的有两种: 一种是询问正确匹配括号个数, 另外一种是询问能否成功匹配, 以及匹配最大深度问题. 对于一个区间而言, 括号能否成功匹配有两个判断标准: ①左右括号数量要相同 ②任意前缀中, 右括号的数目不能大于左括号的数目. 如果我们把左括号看为+1, 右括号看为-1,

Fau的博客 326
上一篇: 2019牛客暑期多校训练营(第八场)D Distance (三维树状数组)
下一篇: 2019牛客暑期多校训练营(第九场)H Cutting Bamboos(二分+主席树)
ttoobne
博客等级 码龄9年 13粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值