• 题意

给出一颗树的括号序,有m个操作,每次交换两个括号,保证交换后括号序仍然合法,输出每次操作后(包括未操作时)树的直径

  • solution

首先转化题目,对于一棵树的括号序,我们找到一段子串,满足将其中匹配的括号消去后剩下的括号最多,那么剩下的括号个数即为所求直径

这样一棵树括号序为()(()) 取出)((,消去匹配括号后剩下3个括号,为所求直径

但这样还是不可做nya,于是我们再转化,钦定左括号值为1,右括号值为-1,问题变为找到相邻的两段,使后一段的数字和减前一段的数字和最大,这个差就是答案

想到这里你就能切这题

那么问题已经转化到这么可做了,对于一个区间问题+待修+维护一些有关区间的值,我们可以用线段树这种简单(奥妙重重)的数据结构

对于每个线段树节点,我们维护 前/后 最小/大值,区间和,答案以及所有 前/后 缀D值的最大值区间D值

D值是什么呢?我们简单为在指定区间内划一条分界线,使 后一半和 减 前一半和 最大,这个差就是这个区间的D值

  • code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ls (x<<1)
#define  rs (x<<1|1)
#define mid ((l+r)>>1)
#define N 200000
using namespace std;
struct zero{
int sum,prex,prem,sucx,sucm,pred,sucd,d,ans;
zero(){}
zero(int p1,int p2,int p3,int p4,int p5,int p6,int p7,int p8,int p9){sum=p1,prex=p2,prem=p3,sucx=p4,sucm=p5,pred=p6,sucd=p7,d=p8,ans=p9;}
}tree[N<<2];
// sum:区间和
// ans:区间答案
// pre/suc-x/m 区间 前/后 缀最 大/小 值
// pre/suc-d 前/后 缀 D值
// d 区间D 值
const zero L=zero(1,1,0,1,0,1,1,1,1);
const zero R=zero(-1,0,-1,0,-1,1,1,1,1);
char input[N];
zero operator +(const zero &a,const zero &b){zero c;c.prex=max(a.prex,a.sum+b.prex);c.sucx=max(b.sucx,a.sucx+b.sum);c.prem=min(a.prem,a.sum+b.prem);c.sucm=min(b.sucm,a.sucm+b.sum);c.d=max(b.d-a.sum,a.d+b.sum);c.pred=max(a.pred,max(b.pred-a.sum,a.d+b.prex));c.sucd=max(b.sucd,max(b.sum+a.sucd,b.d-a.sucm));c.sum=a.sum+b.sum;c.ans=max(max(a.ans,b.ans),max(b.pred-a.sucm,a.sucd+b.prex));return c;
}
void build(int x,int l,int r){if(l==r){if(input[l]=='(')tree[x]=L;else tree[x]=R;return;}build(ls,l,mid),build(rs,mid+1,r);tree[x]=tree[ls]+tree[rs];
}
void update(int x,int l,int r,int pos){if(l==r){if(input[l]=='(')tree[x]=L;else tree[x]=R;return;}if(pos<=mid)update(ls,l,mid,pos);else update(rs,mid+1,r,pos);tree[x]=tree[ls]+tree[rs];
}
int n,m;
int main(){scanf("%d%d",&n,&m);n=(n-1)*2;scanf("%s",input+1);build(1,1,n);printf("%d\n",tree[1].ans);for(int i=1;i<=m;i++){int a,b;scanf("%d%d",&a,&b);swap(input[a],input[b]);update(1,1,n,a),update(1,1,n,b);printf("%d\n",tree[1].ans);}
}

转载于:https://www.cnblogs.com/stepsys/p/11580917.html

[CF1149C](Tree Generator)相关推荐

  1. 数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™

    普通的下标线段树 Count Color Hotel Transformation Tree Generator™ Count Color POJ2777 查询区间内颜色种类数,观察到颜色种类数只有3 ...

  2. Python 生成圣诞树 Santa Tree Generator 不务正业系列#1

    Python - Santa Tree Generator 环境 介绍 实现 方法一 思路 print 相关设置 格式分解 示例 相关设置值 代码 方法二 环境 OS: Windows 10 专业版 ...

  3. 详解python os.walk 实现 tree

    os.walk & 实现tree 代码Doc 实现tree Directory tree generator 代码Doc Directory tree generator.For each d ...

  4. python3 获取 文件 文件夹大小

    获取文件大小 os.path.getsize(file_path):file_path为文件路径 >>> import os >>> os.path.getsize ...

  5. python常用内置模块-Python之OS模块常用内置方法汇总

    OS模块的常用内置方法 chdir修改当前工作目录到指定目录 Change the current working directory to the specified path. chmod修改一个 ...

  6. python 文件操作 os.walk() 方法

    all = os.walk(source_txt_path)# dirpath:从all中存储的source_txt_path下文件夹及子文件夹列表中取出每个文件夹及子文件夹路径 # dirnames ...

  7. pythonfind_python实现find -name的功能

    实现方式一: 使用pyhon的os模块,借助os.listdir():os.pah.isfile():os.path.isdir();os.path.join()等操作文件和目录的方法 思路: 从上往 ...

  8. python3读取文件夹-python3获取文件及文件夹大小

    Help on function walk inmodule os: walk(top, topdown=True, οnerrοr=None, followlinks=False) Director ...

  9. Codeforces Round #556 (Div. 1Div. 2)

    Codeforces Round #556 (Div. 1&&Div. 2) 题号 题目 知识点 A Stock Arbitraging 贪心 B Tiling Challenge 贪 ...

  10. Codeforces Round #556 (Div. 1)

    Codeforces Round #556 (Div. 1) A. Prefix Sum Primes 给你一堆1,2,你可以任意排序,要求你输出的数列的前缀和中质数个数最大. 发现只有\(2\)是偶 ...

最新文章

  1. CoreText入坑一
  2. App Store生存法则:iOS开发者经验分享
  3. 两款自动检测代码工具与插件,开源真香
  4. spark-submit python egg 解决三方件依赖问题
  5. git回退分支提交代码
  6. [LeetCode]#13 3sum
  7. How to bind multiple properties with formatter on one control from Ke
  8. JSP、ASP、PHP Web应用程序怎么这么多P!
  9. 数据推送选择GB28181、RTSP还是RTMP?
  10. word排版插件_8款堪称神器的Office插件,让你工作效率直线飙升!
  11. Mac下ndk交叉编译arm平台程序
  12. oracle归档日志满正常么,oracle归档日志满了的处理方法
  13. 谈谈前端包管理工具 npm yarn pnpm
  14. 线性代数感悟之4 通过增广矩阵查看解的情况上篇
  15. fatal error: google/protobuf/stubs/stringprintf.h: No such file or directory
  16. android 休眠任务不执行_Android休眠机制
  17. hdu5773 --2016多校第四场1010
  18. 智能家居加速落地,景联文科技提供数据采集标注服务
  19. 银河麒麟V10安装与运行人大金仓数据库
  20. BIM+GIS技术为工程数字化转型提供了新的契机

热门文章

  1. collection转换为list_【Java视频教程】day26-List集合
  2. win7工作组无法查看计算机名,win7系统无法查看工作组计算机怎么解决
  3. python try except continue_python中 try、except、finally执行顺序
  4. his提供哪些服务_品牌战略咨询能为企业提供哪些服务
  5. 算法:Minimum Path Sum(最小路径和)
  6. eda多功能时钟设计_Altera FPGACPLD设计 基础篇+高级篇(附随书光盘)
  7. el图oracle,element-ui之el-image-viewer(图片查看器)
  8. 639. 解码方法 2
  9. 300.最长上升子序列
  10. The delay-doppler Channel Symbol Coupling(延迟-多普勒信道符号耦合)(6)