题目

有一个长度为\(n\)的01数列\(a\)和一个长度为\(n\)的数列\(b\)表示权值

支持单点修改以及区间查询,\(0\)和\(1\)可以看作左括号和右括号,

将一段区间所有可匹配的的括号去掉后求剩余位置的权值的最大值


分析

将这个序列看作dfs序,那显然可以将其看作一棵树,

建好树后问题就转换成树上路径查询最大值和单点修改

用两棵线段树维护上行和下行路径最大值即可,细节很多


代码

#include <cstdio>
#include <cctype>
#include <cstdlib>
#define rr register
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<13,stdin)),p1==p2?EOF:*p1++)
using namespace std;
const int N=100011;
struct node{int y,w,flag,next;}e[N]; struct rec{int x,y,flag;}P[N];
int a[2][N],A[2][N],dfn[N],as[N],tot,cnt,top[N]; char buf[1<<13],*p1,*p2;
int dep[N],fat[N],son[N],big[N],n,m,c[N],o[N],root,now,k;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void add(int x,int y,int w,int flag){e[++k]=(node){y,w,flag,as[x]},as[x]=k;}
inline signed max(int a,int b){return a>b?a:b;}
struct zkw{
int w[2][N<<2],bas;
inline void build(int n){
for (bas=1;(bas<<=1)<n+2;);
for (rr int i=bas+1;i<=bas+n;++i)
w[0][i]=a[0][i-bas],w[1][i]=a[1][i-bas];
for (rr int i=bas;i;--i)
w[0][i]=max(w[0][i<<1],w[0][i<<1|1]),
w[1][i]=max(w[1][i<<1],w[1][i<<1|1]);
}
inline void update(int z,int x,int y){
for (w[z][x+=bas]=y,x>>=1;x;x>>=1)
w[z][x]=max(w[z][x<<1],w[z][x<<1|1]);
}
inline signed query(int z,int x,int y){
rr int ans=0;
for (x+=bas-1,y+=bas+1;x^y^1;x>>=1,y>>=1){
if (!(x&1)) ans=max(ans,w[z][x^1]);
if (y&1) ans=max(ans,w[z][y^1]);
}
return ans;
}
}Tre;
inline signed Query(int x,int y){
rr int ans=0,flag=1;
for (;top[x]!=top[y];x=fat[top[x]]){
if (dep[top[x]]<dep[top[y]]) x^=y,y^=x,x^=y,flag^=1;
ans=max(ans,Tre.query(flag,dfn[top[x]],dfn[x]));
}
if (dep[x]>dep[y]) x^=y,y^=x,x^=y; else flag^=1;
if (dfn[x]<dfn[y]) ans=max(ans,Tre.query(flag,dfn[x]+1,dfn[y]));
return ans;
}
inline void dfs1(int x){
dep[x]=dep[fat[x]]+1,son[x]=1;
for (rr int i=as[x],mson=-1;i;i=e[i].next)
if (e[i].y!=fat[x]&&!dep[e[i].y]){
dfs1(e[i].y),son[x]+=son[e[i].y];
if (son[e[i].y]>mson)
big[x]=e[i].y,mson=son[e[i].y];
}
}
inline void dfs2(int x,int linp){
if (dfn[x]) return;
dfn[x]=++tot,a[0][tot]=A[0][x],
a[1][tot]=A[1][x],top[x]=linp;
if (!big[x]) return; dfs2(big[x],linp);
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fat[x]&&e[i].y!=big[x])
dfs2(e[i].y,e[i].y);
}
signed main(){
int size = 256 << 20;
char *p=(char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p) );
n=iut(),m=iut(),root=now=cnt=1;
for (rr int i=1;i<=n;++i) o[i]=iut();
for (rr int i=1;i<=n;++i) c[i]=iut();
for (rr int i=1;i<=n;++i)
if (!o[i]) add(now,++cnt,c[i],0),A[0][cnt]=c[i],P[i]=(rec){now,cnt,0},fat[cnt]=now,now=cnt;
else if (now==root) add(++cnt,now,c[i],1),A[1][now]=c[i],P[i]=(rec){cnt,now,1},fat[now]=cnt,root=now=cnt;
else add(fat[now],now,c[i],1),A[1][now]=c[i],P[i]=(rec){fat[now],now,1},now=fat[now];
dfs1(root),dfs2(root,root),Tre.build(cnt);
for (;m;--m){
rr int z=iut(),x=iut(),y=iut();
if (z==1) Tre.update(P[x].flag,dfn[P[x].y],y),c[x]=y;
else{
if (x==y) {print(c[x]),putchar(10); continue;}
rr int Xx=P[x].x,Yx=P[x].y,flagx=P[x].flag;
rr int Xy=P[y].x,Yy=P[y].y,flagy=P[y].flag;
if (Yx==Yy) {putchar(48),putchar(10); continue;}
print(Query(!flagx?Xx:Yx,flagy?Xy:Yy)),putchar(10);
}
}
return 0;
}

#树链剖分,zkw线段树#nssl 1489 大冰隙2的更多相关文章

  1. HDU 4366 Successor(树链剖分+zkw线段树+扫描线)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...

  2. bzoj 4034 [HAOI2015] T2(树链剖分,线段树)

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1536  Solved: 508[Submit][Status] ...

  3. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 10677  Solved: 4313[Submit ...

  4. poj 3237 Tree(树链剖分,线段树)

    Tree Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 7268   Accepted: 1969 Description ...

  5. bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1272  Solved: 451[Submit][Status ...

  6. bzoj 2243 [SDOI2011]染色(树链剖分,线段树)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4637  Solved: 1726[Submit][Status ...

  7. 【BZOJ3531】旅行(树链剖分,线段树)

    [BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...

  8. 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)

    [BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...

  9. [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树

    软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...

  10. 【洛谷5439】【XR-2】永恒(树链剖分,线段树)

    [洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这 ...

随机推荐

  1. Feign入门介绍

    Feign入门介绍 基本概述 除Feign之外,在Java中经常使用的HTTP客户端组件主要有3个,如下: (1)HttpURLConnection,JDK自带 (2)Apache HttpClien ...

  2. React 组件通信方式

    人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得到最后的奖杯. 1. 父子组件通信方式 1.1 父组件传递到子组件 直接通过属性进行传递,数据的传递可以提高组 ...

  3. 【Azure 环境】Windows中安装Python azure-eventhub-checkpointstoreblob-aio模块时出错 ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:

    问题描述 在使用Python代码接受EventHub的消息时,根据文档要求安装azure-eventhub-checkpointstoreblob-aio模块时,出现了如下错误: ERROR: Cou ...

  4. 苏宁基于 AI 和图技术的智能监控体系的建设

    汤泳,苏宁科技集团智能监控与运维产研中心总监,中国商业联合会智库顾问,致力于海量数据分析.基于深度学习的时间序列分析与预测.自然语言处理和图神经网络的研究.在应用实践中,通过基于 AI 的方式不断完善 ...

  5. minio通过docker方式部署

    MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储. 它是与 Amazon S3 云存储服务兼容的 API 官方文档http://docs.minio.org.c ...

  6. 精贴总结 - 万字长文带你入门Istio

    原文 - 万字长文带你入门Istio 一.个人看法 背景:以docker+k8s普及,支持快速部署,通过k8s允许统一管理 解决:1)设计分布式系统,导致开发难度提高:2)统一多语言的服务治理方案 目 ...

  7. Java核心之细说泛型

    泛型是什么? 等你使用java逐渐深入以后会了解或逐步使用到Java泛型.Java 中的泛型是 JDK 5 中引入的功能之一."Java 泛型 "是一个技术术语,表示一组与定义和使 ...

  8. [学习笔记].Net5项目打包到Linux系统服务时遇到的坑

    ​如果按照官方文档的步骤手动安装.Net5 会有一个坑: 在 Linux 上手动安装 .NET - .NET | Microsoft Docs 在使用systemd打包.Net5服务的时候,无法运行, ...

  9. idea 暂存 Stash Changes Git/Repository/Stash Changes 恢复暂存 UnStash Changes

    idea 暂存 Stash Changes Git/Repository/Stash Changes 恢复暂存 UnStash Changes git stash save "save me ...

  10. electron打包踩过的坑总结 好文

    electron打包踩过的坑总结 https://segmentfault.com/a/1190000018533945