【bzoj2325】【ZJOI2011】【道馆之战】【树链剖分】
发布日期:2021-11-16 15:38:07 浏览次数:23 分类:技术文章

本文共 3371 字,大约阅读时间需要 11 分钟。

Description

口袋妖怪(又名神奇宝贝或宠物小精灵)//绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中的每一个冰块都只能经过一次。当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才会被打开。

三个冰地分别如下:

当走出第三个冰地之后,就可以与馆主进行道馆战了。

馆主发现这个难度太小,导致经常有挑战者能通过,为了加大难度,将道馆分成了n个房间,每个房间中是两个冰块或障碍,表示一列冰地。任意两个房间之间均有且仅有一条路径相连,即这n个房间构成一个树状结构。

每个房间分成了AB两个区域,每一区域都是一个薄冰块或者障碍物。每次只能移动到相邻房间的同一类区域(即若你现在在这个房间的A区域,那么你只能移动到相邻房间的A区域)或这个房间的另一区域。

现在挑战者从房间u出发,馆主在房间v,那么挑战者只能朝接近馆主所在房间的方向过去。一开始挑战者可以在房间u的任意一个冰块区域内。如果挑战者踩过的冰块数达到了最大值(即没有一种方案踩过的冰块数更多了),那么当挑战者走到最后一个冰块上时,他会被瞬间传送到馆主面前与馆主进行道馆战。

自从馆主修改规则后已经经过了m天,每天要么是有一个挑战者来进行挑战,要么就是馆主将某个房间进行了修改。对于每个来的挑战者,你需要计算出他若要和馆主进行战斗需要经过的冰块数。

Input

第一行包含两个正整数nm

2行到第n行,每行包含两个正整数xy,表示一条连接房间x和房间y的边。房间编号为1n

接下来n行,每行包含两个字符。第n + k行表示房间k的两个区域,第一个字符为A区域,第二个字符为B区域。其中“.(ASCII码为46)表示是薄冰块,“#(ASCII码为35)表示是障碍物。

最后的m行,每行一个操作:

u s:将房间u里的两个区域修改为s

u v:询问挑战者在房间u,馆主在房间v时,挑战者能与馆主进行挑战需要踩的冰块数。如果房间u的两个区域都是障碍物,那么输出0

Output

 包含若干行,每行一个整数。即对于输入中的每个询问,依次输出一个答案。

Sample Input

5 3

1 2

2 3

2 4

1 5

.#

..

#.

.#

..

Q 5 3

C 1 ##

Q 4 5

Sample Output

6

3

HINT

【样例说明】


第一个询问,从房间5出发经过的冰块数最多的路径为:



第二个询问,从房间4出发经过的冰块数最多的路径为:



【数据规模】



 N 30 000

 80 000

题解:浙江省出这题竟然没有区间修改。
          用a,b,c,d分别表示从左上到右上,从左上到右下,从左下到右上,从左下到右下最多经过的冰块数.
          用l1,l2,r1,r2分别表示从左上,左下,右上,右下出发最多经过的冰块数.
          合并什么的自行yy吧,也不是很复杂。
          注意询问的时候要把x-lca(x,y)-y中x-lca(x,y)这条链反过来再合并。
 代码:
#include
#include
#include
#define N 30010#define INF 100000000using namespace std;int point[N],next[N*2],sz,pos[N],n,m,x,y,cnt,deep[N],fa[N][20],bl[N],size[N];struct use{int st,en;}e[N*2]; char ch[N][2],opt[2];struct seg{int a,b,c,d,l1,l2,r1,r2;}t[N*4];void add(int x,int y){next[++cnt]=point[x];point[x]=cnt;e[cnt].en=y;}int lca(int x,int y){ if (deep[x]
=0;i--) if (fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i]; if (x==y) return x;else return fa[x][0];}seg updata(seg x,seg y){ seg tt; tt.a=max(x.a+y.a,x.b+y.c);if (tt.a<0) tt.a=-INF; tt.b=max(x.a+y.b,x.b+y.d);if (tt.b<0) tt.b=-INF; tt.c=max(x.c+y.a,x.d+y.c);if (tt.c<0) tt.c=-INF; tt.d=max(x.d+y.d,x.c+y.b);if (tt.d<0) tt.d=-INF; tt.l1=max(x.a+y.l1,x.b+y.l2);tt.l1=max(tt.l1,x.l1);if (tt.l1<0) tt.l1=-INF; tt.l2=max(x.c+y.l1,x.d+y.l2);tt.l2=max(tt.l2,x.l2);if (tt.l2<0) tt.l2=-INF; tt.r1=max(y.a+x.r1,y.c+x.r2);tt.r1=max(tt.r1,y.r1);if (tt.r1<0) tt.r1=-INF; tt.r2=max(y.b+x.r1,y.d+x.r2);tt.r2=max(tt.r2,y.r2);if (tt.r2<0) tt.r2=-INF; return tt;}void change(int k,int l,int r,int x,char ch[2]){ int mid=(l+r)>>1; if (l==r){ t[k].a=t[k].b=t[k].c=t[k].d=-INF; t[k].l1=t[k].l2=t[k].r1=t[k].r2=-INF; if (ch[0]=='.') t[k].a=t[k].l1=t[k].r1=1; if (ch[1]=='.') t[k].d=t[k].l2=t[k].r2=1; if (ch[0]=='.'&&ch[1]=='.') t[k].b=t[k].c=t[k].l1=t[k].l2=t[k].r1=t[k].r2=2; return ; } if (x<=mid) change(k<<1,l,mid,x,ch);else change(k<<1|1,mid+1,r,x,ch); t[k]=updata(t[k<<1],t[k<<1|1]);} seg query(int k,int l,int r,int ll,int rr){ int mid=(l+r)>>1; if(l==ll&&r==rr){return t[k];} if(mid>=rr)return query(k<<1,l,mid,ll,rr); else if(mid
size[k]) k=e[i].en; if (!k) return;dfs2(k,c); for (int i=point[x];i;i=next[i]) if(e[i].en!=k&&e[i].en!=fa[x][0]) dfs2(e[i].en,e[i].en); }int main(){ scanf("%d%d",&n,&m); for (int i=1;i<=n-1;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);} for(int i=1;i<=n;i++)scanf("%s",ch[i]); dfs(1);dfs2(1,1); for (int i=1;i<=m;i++){ scanf("%s",opt); if (opt[0]=='Q'){scanf("%d%d",&x,&y);solve(x,y);} else{scanf("%d",&x);scanf("%s",ch[x]);change(1,1,n,pos[x],ch[x]);} } }

转载地址:https://blog.csdn.net/sunshinezff/article/details/50915017 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【bzoj1982】【Spoj2021】【Moving Pebbles】【博弈论】
下一篇:【bzoj1576】【安全路径Travel】【dijkstra+树链剖分】

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月28日 14时43分25秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Java 冒泡排序详解,一分钟理解冒泡排序 2019-04-26
Struts2的执行流程 2019-04-26
Struts2的常见配置,配置XML的提示,Struts2的配置文件,package 的配置,Action的配置,常量的配置,Struts2的分模块开发的配置 2019-04-26
C语言算法,图解+详解 统计输入字符串当中要查找字符串的数量,substr所指的子符串在str所指的字符串中出现的次数。 2019-04-26
Java 当中 通过Date获取时间和通过SimpleDateFormat格式化时间 2019-04-26
Struts的数据的封装,属性驱动:提供属性set方法的方式,属性驱动:页面中提供一种表达式,模型驱动:采用模型驱动的方式,INPUT的逻辑视图的配置 2019-04-26
Struts2的复杂数据类型的封装,封装数据到List集合中,封装数据到Map集合当中 2019-04-26
Mysql计算月份差 2019-04-26
OGNL,OGNL在Struts2环境当中的使用(入门) 2019-04-26
Java OGNL入门(Java环境当中使用) 2019-04-26
Struts2的值栈(ValueStack),详解+图解 2019-04-26
OGNL中特殊字符 # $ %的用法和含义,案例+解析 2019-04-26
Struts2的拦截器,Struts2的执行流程,图解+详解(底层代码)以及 自定义拦截器(配置和使用) 2019-04-26
Struts2的标签库大全(案例+用法+解析) 2019-04-26
Struts2数据有效性的校验的两种方式,Struts2数据校验(案例+解析) 2019-04-26
Struts2的国际化 全局的国际化:(JSP,Action,配置文件)Action范围的国际化:包范围的国际化:临时的国际化 2019-04-26
Spring的IOC的注解开发(案例+解析) 2019-04-26
Spring的AOP(面向切面编程)的XML开发以及Spring的AOP的底层原理(案例+解析) 2019-04-26
Spring的切入点AspectJ表达式(解析) 2019-04-26
Spring的AOP的注解开发,基于AspectJ的注解开发 2019-04-26