bzoj千题计划243:bzoj2325: [ZJOI2011]道馆之战
http://www.lydsy.com/JudgeOnline/problem.php?id=2325
设线段树节点区间为[l,r]
每个节点维护sum[0/1][0/1] 从l的A/B区域到r的A/B区域 经过冰块的最大数量
mx[0][0] 从l的A区域出发向r经过冰块的最大数量
mx[0][1] 从l的B区域出发向r经过冰块的最大数量
mx[1][0] 从r的A区域出发向l经过冰块的最大数量
mx[1][1] 从r的B区域出发向l经过冰块的最大数量
#include<cstdio>
#include<iostream>
#include<algorithm> #define N 30001 using namespace std; int n; int front[N],nxt[N<<],to[N<<],tot; int fa[N],dep[N],siz[N];
int bl[N]; int id[N],dy[N],cnt; bool a[N][]; #define max(x,y) ((x)>(y) ? (x) : (y)) struct node
{
int sum[][];
int mx[][]; node()
{
for(int i=;i<;++i)
for(int j=;j<;++j)
sum[i][j]=mx[i][j]=;
} node operator + (node p) const
{
node k;
for(int i=;i<=;++i)
for(int j=;j<=;++j)
{
if(sum[i][] && p.sum[][j])
k.sum[i][j]=max(k.sum[i][j],sum[i][]+p.sum[][j]);
if(sum[i][] && p.sum[][j])
k.sum[i][j]=max(k.sum[i][j],sum[i][]+p.sum[][j]);
}
k.mx[][]=max(k.sum[][],k.sum[][]);
k.mx[][]=max(k.sum[][],k.sum[][]);
k.mx[][]=max(k.sum[][],k.sum[][]);
k.mx[][]=max(k.sum[][],k.sum[][]);
if(sum[][]) k.mx[][]=max(k.mx[][],sum[][]+p.mx[][]);
if(sum[][]) k.mx[][]=max(k.mx[][],sum[][]+p.mx[][]);
if(sum[][]) k.mx[][]=max(k.mx[][],sum[][]+p.mx[][]);
if(sum[][]) k.mx[][]=max(k.mx[][],sum[][]+p.mx[][]);
if(p.sum[][]) k.mx[][]=max(k.mx[][],mx[][]+p.sum[][]);
if(p.sum[][]) k.mx[][]=max(k.mx[][],mx[][]+p.sum[][]);
if(p.sum[][]) k.mx[][]=max(k.mx[][],mx[][]+p.sum[][]);
if(p.sum[][]) k.mx[][]=max(k.mx[][],mx[][]+p.sum[][]);
k.mx[][]=max(k.mx[][],mx[][]);
k.mx[][]=max(k.mx[][],mx[][]);
k.mx[][]=max(k.mx[][],p.mx[][]);
k.mx[][]=max(k.mx[][],p.mx[][]);
return k;
} void turn()
{
swap(sum[][],sum[][]);
swap(mx[][],mx[][]);
swap(mx[][],mx[][]);
} }tr[N<<]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot;
} void dfs1(int x)
{
siz[x]=;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa[x])
{
fa[to[i]]=x;
dep[to[i]]=dep[x]+;
dfs1(to[i]);
siz[x]+=siz[to[i]];
}
} void dfs2(int x,int top)
{
bl[x]=top;
id[x]=++cnt;
dy[cnt]=x;
int y=;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa[x] && siz[to[i]]>siz[y]) y=to[i];
if(y) dfs2(y,top);
else return;
for(int i=front[x];i;i=nxt[i])
if(to[i]!=y && to[i]!=fa[x]) dfs2(to[i],to[i]);
} void build(int k,int l,int r)
{
if(l==r)
{
if(a[dy[l]][]) tr[k].sum[][]=;
if(a[dy[l]][]) tr[k].sum[][]=;
if(a[dy[l]][] && a[dy[l]][]) tr[k].sum[][]=tr[k].sum[][]=;
tr[k].mx[][]=max(tr[k].sum[][],tr[k].sum[][]);
tr[k].mx[][]=max(tr[k].sum[][],tr[k].sum[][]);
tr[k].mx[][]=max(tr[k].sum[][],tr[k].sum[][]);
tr[k].mx[][]=max(tr[k].sum[][],tr[k].sum[][]);
return;
}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
tr[k]=tr[k<<]+tr[k<<|];
} node query(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr) return tr[k];
int mid=l+r>>;
if(opr<=mid) return query(k<<,l,mid,opl,opr);
else if(opl>mid) return query(k<<|,mid+,r,opl,opr);
else return query(k<<,l,mid,opl,opr)+query(k<<|,mid+,r,opl,opr);
} void Query(int u,int v)
{
node ansu,ansv;
bool firstu=false,firstv=false;
while(bl[u]!=bl[v])
{
if(dep[bl[u]]>dep[bl[v]])
{
if(!firstu) firstu=true,ansu=query(,,n,id[bl[u]],id[u]);
else ansu=query(,,n,id[bl[u]],id[u])+ansu;
u=fa[bl[u]];
}
else
{
if(!firstv) firstv=true,ansv=query(,,n,id[bl[v]],id[v]);
else ansv=query(,,n,id[bl[v]],id[v])+ansv;
v=fa[bl[v]];
}
}
if(dep[u]>dep[v])
{
if(!firstu) firstu=true,ansu=query(,,n,id[v],id[u]);
else ansu=query(,,n,id[v],id[u])+ansu;
}
else
{
if(!firstv) firstv=true,ansv=query(,,n,id[u],id[v]);
else ansv=query(,,n,id[u],id[v])+ansv;
}
if(!firstu) ansu=ansv;
else
{
ansu.turn();
if(firstv) ansu=ansu+ansv;
}
cout<<max(ansu.mx[][],ansu.mx[][])<<'\n';
} void change(int k,int l,int r,int x,bool u,bool v)
{
if(l==r)
{
a[l][]=u;
a[l][]=v;
if(a[l][]) tr[k].sum[][]=;
else tr[k].sum[][]=;
if(a[l][]) tr[k].sum[][]=;
else tr[k].sum[][]=;
if(a[l][] && a[l][]) tr[k].sum[][]=tr[k].sum[][]=;
else tr[k].sum[][]=tr[k].sum[][]=;
tr[k].mx[][]=max(tr[k].sum[][],tr[k].sum[][]);
tr[k].mx[][]=max(tr[k].sum[][],tr[k].sum[][]);
tr[k].mx[][]=max(tr[k].sum[][],tr[k].sum[][]);
tr[k].mx[][]=max(tr[k].sum[][],tr[k].sum[][]);
return;
}
int mid=l+r>>;
if(x<=mid) change(k<<,l,mid,x,u,v);
else change(k<<|,mid+,r,x,u,v);
tr[k]=tr[k<<]+tr[k<<|];
} int main()
{
freopen("fight.in","r",stdin);
freopen("fight.out","w",stdout);
int m;
read(n); read(m);
int u,v;
for(int i=;i<n;++i)
{
read(u); read(v);
add(u,v);
}
dfs1();
dfs2(,);
char s[];
for(int i=;i<=n;++i)
{
scanf("%s",s);
if(s[]=='.') a[i][]=true;
if(s[]=='.') a[i][]=true;
}
build(,,n);
char c[];
while(m--)
{
scanf("%s",c);
if(c[]=='Q')
{
read(u); read(v);
Query(u,v);
}
else
{
read(u);
scanf("%s",c);
change(,,n,id[u],c[]=='.',c[]=='.');
}
}
}
bzoj千题计划243:bzoj2325: [ZJOI2011]道馆之战的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划139:bzoj2229: [Zjoi2011]最小割
http://www.lydsy.com/JudgeOnline/problem.php?id=2229 最小割树介绍:http://blog.csdn.net/jyxjyx27/article/de ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...
随机推荐
- 【BZOJ1911】【APIO2010】特别行动队(斜率优化,动态规划)
[BZOJ1911][APIO2010]特别行动队 题面 Description 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号, 要将他们拆分成若干特别行动队调入战场.出于默契的考 ...
- 【CJOJ2512】gcd之和(莫比乌斯反演)
[CJOJ2512]gcd之和(莫比乌斯反演) 题面 给定\(n,m(n,m<=10^7)\) 求 \[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\] 题解 首先把公因数直 ...
- 【Luogu1919】 A*B Problem升级版(FFT)
题面戳我 题解 把每个数都直接看做一个多项式,每一位就是一项 现在求用FFT求出卷积 然后考虑一下进位就可以啦 #include<iostream> #include<cstdio& ...
- Type Archive for required library: 'C:/Users/EuphemiaShaw/.m2/repository/org/apache/hadoop/hadoop-hdfs/2.6.5/hadoop-hdfs-2.6.5.jar' in project 'mapreduce' cannot be read or is not a valid ZIP file
error: Description Resource Path Location Type Archive for required library: 'C:/Users/EuphemiaShaw/ ...
- 19.JavaScript
简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型 1.注释 单行 // 多行 /* */ 2.引用方式 <head> <meta c ...
- Java中的代理模式--静态代理和动态代理本质理解
代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...
- 免费后台管理UI界面、html源码推荐
一个好的UI应该满足的条件应该达到如下几个: 1.美观.大方.简洁 2.兼容IE8.不考虑兼容IE6/IE7,因为现在还有很多公司在使用Win7系统,系统内置了IE8 3.能通过选项卡打开多个页面,不 ...
- map/vector erase
问题核心:erase之后迭代器是否失效 vector调用erase之后,该迭代器之后的迭代器都失效: map调用erase之后,其他迭代器并不会失效. vector<int> vecDat ...
- JS如何判断滚动条是否滚到底部
判断滚动条到底部,需要用到DOM的三个属性值,即scrollTop.clientHeight.scrollHeight. scrollTop为滚动条在Y轴上的滚动距离. clientHeigh ...
- 微信小程序调接口常见问题解决方法
第一次调接口时遇见的bug. 注意:接口的域名不能使用 IP 地址或 localhost,且不能带端口号: 微信小程序如何调接口? wx.request({ url: 'http://miniapp/ ...