#树链剖分,zkw线段树#nssl 1489 大冰隙2
题目
有一个长度为\(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的更多相关文章
- HDU 4366 Successor(树链剖分+zkw线段树+扫描线)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 10677 Solved: 4313[Submit ...
- poj 3237 Tree(树链剖分,线段树)
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 7268 Accepted: 1969 Description ...
- bzoj 3626 [LNOI2014]LCA(离线处理+树链剖分,线段树)
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1272 Solved: 451[Submit][Status ...
- bzoj 2243 [SDOI2011]染色(树链剖分,线段树)
2243: [SDOI2011]染色 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4637 Solved: 1726[Submit][Status ...
- 【BZOJ3531】旅行(树链剖分,线段树)
[BZOJ3531]旅行(树链剖分,线段树) 题面 Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教 ...
- 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)
[BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...
- [bzoj4196][Noi2015]软件包管理器_树链剖分_线段树
软件包管理器 bzoj-4196 Noi-2015 题目大意:Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件 ...
- 【洛谷5439】【XR-2】永恒(树链剖分,线段树)
[洛谷5439][XR-2]永恒(树链剖分,线段树) 题面 洛谷 题解 首先两个点的\(LCP\)就是\(Trie\)树上的\(LCA\)的深度. 考虑一对点的贡献,如果这两个点不具有祖先关系,那么这 ...
随机推荐
- django学习第六天---shell指令,单表基于双下划线的模糊查询,distinct注意点,字段的choices属性,url反向解析,orm多表操作创建表
shell指令 命令 python manage.py shell 在Terminal,执行上面这个指令会进入到python解释器环境中,并且加载了我们当前django项目配置环境,所以可以在当前sh ...
- 前端保存JWT的使用方法
我们可以将JWT保存在cookie中,也可以保存在浏览器的本地存储里,我们保存在浏览器本地存储中 浏览器的本地存储提供了sessionStorage 和 localStorage 两种,从属于wind ...
- CGI, FastCGI, WSGI, uWSGI, uwsgi一文搞懂
中间件 1.服务器中间件:nginx,apache 2.数据库中间件:介于应用程序和数据库之前的,MyCat 3.消息队列中间件:kafka,rabbitmq,Rocketmq CGI 1.CGI是一 ...
- 我的第一个项目(十五) :完成数据保存功能(后端,改update)
好家伙, 代码已开源(Gitee) PH-planewar: 个人开发的全栈小游戏 前端:vue2 + element-ui 后端: Springboot + mybatis-plus 数据库: ...
- Java 开发人员调度软件项目 (java基础编程总结项目)+javaBean+测试代码+数组知识+数据结构+继承+多态+封装+自定义异常,异常处理+构造器知识+重载+重写+接口+实现接口+关键字使用(static +equalsIgnoreCase+fianl+instanceof判断类型)+向下转型与向上转型
/** * * @Description Java 开发人员调度软件项目 (java基础编程总结项目) * +javaBean+测试代码+数组知识+数据结构+继承+多态+封装+自定义异常,异常处理 * ...
- 微软应用商店错误代码“0x80131500”怎么修复?
处理方法一 打开"运行"输入 inetcpl.cpl ("WINDOWS"+"R"键,输入 inetcpl.cpl亦可),点开高级往下拉,勾 ...
- Caxa 二次开发 ObjectCRX-1 踩坑:环境配置以及 Helloworld
绝了,坑是真 nm 的多,官方给的文档里到处都是坑. 用的环境 ObjectCRX,以下简称 objcrx. #1 安装环境 & 参考文档的大坑 #1.1 Caxa 提供的文档和环境安装包 首 ...
- Java Spring Redis 如何向Set中添加List?
调用list.toArray方法将list转成数组,再使用add方法参数传入数组,即可批量添加. redisTemplate.opsForSet().add(key,collect.toArray(n ...
- 5、Azure Devops之Azure Test Plans篇
1.什么是Azure Test Plans Azure Test Plans是提供给团队测试人员,管理测试计划.测试套件.测试用例的部件.管理测试计划.测试用例的定义,包括请求类型定义.参数定义,执行 ...
- 反转链表——java
给定一个链表,请你将链表反转过来. 举例:原链表:1→2→3→4→5→null 反转链表:5→4→3→2→1→null 代码: package algorithm_niuke; public clas ...