【BZOJ】1984 月下“毛景树”
【算法】树链剖分+线段树
【题解】线段树的区间加值和区间覆盖操作不能同时存在,只能存在一个。
修改:从根节点跑到目标区域路上的标记全部下传,打完标记再上传回根节点(有变动才需要上传)。
询问:访问到目标区域路上的标记全部下传。
我写的线段树版本是在打标记的同时便对该点的询问项(最大值)做了对应更改,即可保证访问到该点得到的ms就是该点的答案。
访问某点时如果要询问最大值就直接拿走,如果要还要访问该点的子节点就需要下传。
而修改了某点的值,它的祖先的值就都需要变动,所以一旦修改必须上传至顶。
对于add和cover不共存的问题,下传过程:
void pushdown(int k)
{
if(t[k].l==t[k].r)return;
if(t[k].c!=-)
{
t[k<<].a=t[k<<|].a=;
t[k<<].c=t[k<<|].c=t[k].c;
t[k<<].ms=t[k<<|].ms=t[k].c;
t[k].c=-;
}
if(t[k].a!=)
{
if(t[k<<].c!=-)t[k<<].c+=t[k].a;
else t[k<<].a+=t[k].a;
if(t[k<<|].c!=-)t[k<<|].c+=t[k].a;
else t[k<<|].a+=t[k].a;
t[k<<].ms+=t[k].a;t[k<<|].ms+=t[k].a;
t[k].a=;
}
}
下传cover时,子树add'=0,cover'=cover,ms=cover
下传add时,就要看子树的标记是cover还是add了。
边权赋给下面的点,注意LCA不算(树剖过程中顺便处理即可,不必写倍增)
不在同一条重链时,是deep[top[u]]大的先,不是deep[u]。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=,inf=0x3f3f3f3f;
struct tree{int l,r,c,a,ms;}t[maxn*];
struct edge{int v,w,from;}e[maxn*];
int dfsnum,n,pos[maxn],size[maxn],first[maxn],deep[maxn],f[maxn],id[maxn*],tot,top[maxn];
void insert(int u,int v,int w)
{tot++;e[tot].v=v;e[tot].w=w;e[tot].from=first[u];first[u]=tot;}
void build(int k,int l,int r)
{
t[k].l=l;t[k].r=r;t[k].c=-;
if(l!=r)
{
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
}
}
void pushdown(int k)
{
if(t[k].l==t[k].r)return;
if(t[k].c!=-)
{
t[k<<].a=t[k<<|].a=;
t[k<<].c=t[k<<|].c=t[k].c;
t[k<<].ms=t[k<<|].ms=t[k].c;
t[k].c=-;
}
if(t[k].a!=)
{
if(t[k<<].c!=-)t[k<<].c+=t[k].a;
else t[k<<].a+=t[k].a;
if(t[k<<|].c!=-)t[k<<|].c+=t[k].a;
else t[k<<|].a+=t[k].a;
t[k<<].ms+=t[k].a;t[k<<|].ms+=t[k].a;
t[k].a=;
}
}
void pushup(int k)
{
t[k].ms=max(t[k<<].ms,t[k<<|].ms);
}
void cover(int k,int l,int r,int x)
{
int left=t[k].l,right=t[k].r;
pushdown(k);
if(l<=left&&right<=r)t[k].c=x,t[k].ms=x;
else
{
int mid=(left+right)>>;
if(l<=mid)cover(k<<,l,r,x);
if(r>mid)cover(k<<|,l,r,x);
pushup(k);
}
}
void add(int k,int l,int r,int x)
{
int left=t[k].l,right=t[k].r;
pushdown(k);
if(l<=left&&right<=r)t[k].a+=x,t[k].ms+=x;
else
{
int mid=(left+right)>>;
if(l<=mid)add(k<<,l,r,x);
if(r>mid)add(k<<|,l,r,x);
pushup(k);
}
}
int ask(int k,int l,int r)
{
int left=t[k].l,right=t[k].r;
if(l<=left&&right<=r)return t[k].ms;
else
{
int mid=(left+right)>>;
pushdown(k);int mss=-inf;
if(l<=mid)mss=ask(k<<,l,r);
if(r>mid)mss=max(mss,ask(k<<|,l,r));
return mss;
}
}
void solve_cover()
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
while(top[u]!=top[v])
{
if(deep[top[u]]<deep[top[v]])swap(u,v);
cover(,pos[top[u]],pos[u],w);
u=f[top[u]];
}
if(pos[u]>pos[v])swap(u,v);
if(pos[u]<pos[v])cover(,pos[u]+,pos[v],w);
}
void solve_add()
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
while(top[u]!=top[v])
{
if(deep[top[u]]<deep[top[v]])swap(u,v);
add(,pos[top[u]],pos[u],w);
u=f[top[u]];
}
if(pos[u]>pos[v])swap(u,v);
if(pos[u]<pos[v])add(,pos[u]+,pos[v],w);
}
void ask_max()
{
int u,v;
scanf("%d%d",&u,&v);
int maxs=-inf;
while(top[u]!=top[v])
{
if(deep[top[u]]<deep[top[v]])swap(u,v);
maxs=max(maxs,ask(,pos[top[u]],pos[u]));
u=f[top[u]];
}
if(pos[u]>pos[v])swap(u,v);
if(pos[u]<pos[v])maxs=max(maxs,ask(,pos[u]+,pos[v]));
printf("%d\n",maxs);
}
void dfs1(int x,int fa)
{
size[x]=;
for(int i=first[x];i;i=e[i].from)
if(e[i].v!=fa)
{
int y=e[i].v;
deep[y]=deep[x]+;
f[y]=x;
dfs1(y,x);
size[x]+=size[y];
}
}
void dfs2(int x,int tp,int fa)
{
pos[x]=++dfsnum;
top[x]=tp;
int k=;
for(int i=first[x];i;i=e[i].from)
if(e[i].v!=fa){if(size[e[i].v]>size[k])k=e[i].v;}
else id[(i+)>>]=x,add(,pos[x],pos[x],e[i].w);
if(k==)return;//!!!
dfs2(k,tp,x);
for(int i=first[x];i;i=e[i].from)
if(e[i].v!=fa&&e[i].v!=k)dfs2(e[i].v,e[i].v,x);
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
insert(u,v,w);
insert(v,u,w);
}
build(,,n);
dfs1(,-);
dfs2(,,-);
char st[];int u,v;
for(;;)
{
scanf("%s",st);
if(st[]=='h')//change
{
scanf("%d%d",&u,&v);
cover(,pos[id[u]],pos[id[u]],v);
}
if(st[]=='o')solve_cover();//cover
if(st[]=='d')solve_add();//add
if(st[]=='a')ask_max();//max
if(st[]=='t')break;//stop
}
return ;
}
【BZOJ】1984 月下“毛景树”的更多相关文章
- BZOJ 1984: 月下“毛景树” [树链剖分 边权]
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1728 Solved: 531[Submit][Status][Discu ...
- Bzoj 1984: 月下“毛景树” 树链剖分
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1282 Solved: 410[Submit][Status][Discu ...
- BZOJ 1984月下“毛景树” LCT维护边权 + 下传标记
Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树” ...
- BZOJ 1984 月下“毛景树”
我觉得我要把BZOJ上的链剖写完了吧.... #include<iostream> #include<cstdio> #include<cstring> #incl ...
- BZOJ 1984: 月下“毛景树” (树链剖分+线段树)
注意赋值和加法的标记下传优先级.具体看代码. CODE #include <vector> #include <queue> #include <cstdio> # ...
- BZOJ1984: 月下“毛景树”
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 713 Solved: 245[Submit][Status] Descri ...
- 【BZOJ-1984】月下“毛景树” 树链剖分
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1314 Solved: 416[Submit][Status][Discu ...
- 【BZOJ1984】月下“毛景树” 树链剖分+线段树
[BZOJ1984]月下"毛景树" Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校 ...
- P4315 月下“毛景树”
P4315 月下"毛景树" 题目描述 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里. 爬啊爬~爬啊爬 ...
随机推荐
- JAVA mysql数据库 配置
mysql 版本 5.7 数据库连接版本 <!--MySql--><dependency> <groupId>mysql</groupId> <a ...
- [贪心经典算法]Kruskal算法
Kruskal算法的高效实现需要一种称作并查集的结构.我们在这里不介绍并查集,只介绍Kruskal算法的基本思想和证明,实现留在以后讨论. Kruskal算法的过程: (1) 将全部边按照权值由小到大 ...
- [经典贪心算法]Prim算法
最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...
- 内部网关协议RIP 路由选择算法(距离向量)
RIP是一种基于距离向量的路由选择协议 RIP的距离就是指的跳数,没经过一个路由,就是一跳,RIP允许一跳路径最多经过15个路由器,所以16个的话就相当于不可以到达了 RIP协议的特点: 1:仅和相邻 ...
- HDU2376Average distance(树形dp|树上任意两点距离和的平均值)
思路: 引:如果暴力枚举两点再求距离是显然会超时的.转换一下思路,我们可以对每条边,求所有可能的路径经过此边的次数:设这条边两端的点数分别为A和B,那 么这条边被经过的次数就是A*B,它对总的距离和的 ...
- OSG学习:移动/缩放/旋转模型
移动和缩放以及旋转都是对矩阵进行操作,这些操作如果要叠加直接矩阵相乘就可以了. 下面的示例代码中,加入了四个bignathan,一个是默认加入在最中间,一个向上移2单位,一个是向下移2单位且缩放0.5 ...
- C# Winform Excel的导出,根据excel模板导出数据
namespace dxhbskymDemo { public partial class ExcelForm : DevExpress.XtraEditors.XtraForm { public E ...
- CentOS 双网卡绑定实现平衡负载
绑定两块网卡主要为了解决网卡故障.负载均衡等问题. 1.在vm加一块网卡,登录后检查网卡是否识别. 分别用ip addr和nmcli查看网卡的情况 [root@bigdata-senior01 ~]# ...
- java 注解使用笔记
一.语法 注解也属于一种类型 public @interface MyTestAnnotation { } 用@interface描述 根据情况可以应用于包.类型.构造方法.方法.成员变量.参数及本地 ...
- 【题解】Atcoder ARC#83 E-Bichrome Tree
哈哈~自己做出来的E题!(虽然这题被机房大佬强D极水).最开始神经错乱,写了个完全不对的贪心,竟然只错了4个点(。•ˇ‸ˇ•。) 可以发现,一个节点的子树内部和他颜色相同的节点权值和 是固定的,那么不 ...