2018.10.27 bzoj1984: 月下“毛景树”(树链剖分)
传送门
唉蒟蒻又退化了,这道sb题居然做了20min,最后发现是updcovupdcovupdcov写成了updaddupdaddupdadd我还能说什么233233233
就是让你转边权为点权之后,支持树上路径覆盖,单点覆盖,路径加,求路径最大。
直接乱码一发居然AAA了?
贴代码了(稍微有点长):
#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
const int N=1e5+5;
int n,m,first[N],top[N],dep[N],fa[N],siz[N],hson[N],pred[N],num[N],a[N],cnt=0,tot=0;
struct edge{int v,next,w;}e[N<<1];
inline void add(int u,int v,int w){e[++cnt].v=v,e[cnt].w=w,e[cnt].next=first[u],first[u]=cnt;}
void dfs1(int p){
siz[p]=1;
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v==fa[p])continue;
fa[v]=p,dep[v]=dep[p]+1,a[v]=e[i].w,dfs1(v),siz[p]+=siz[v];
if(siz[v]>siz[hson[p]])hson[p]=v;
}
}
void dfs2(int p,int tp){
top[p]=tp,pred[num[p]=++tot]=p;
if(!hson[p])return;
dfs2(hson[p],tp);
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v!=fa[p]&&v!=hson[p])dfs2(v,v);
}
}
struct Node{int l,r,mx,cov,add;}T[N<<2];
inline void pushup(int p){T[p].mx=max(T[lc].mx,T[rc].mx);}
inline void pushadd(int p,int v){T[p].mx+=v,T[p].add+=v;}
inline void pushcov(int p,int v){T[p].mx=v,T[p].cov=v,T[p].add=0;}
inline void pushdown(int p){
if(~T[p].cov)pushcov(lc,T[p].cov),pushcov(rc,T[p].cov),T[p].cov=-1;
if(T[p].add)pushadd(lc,T[p].add),pushadd(rc,T[p].add),T[p].add=0;
}
inline void build(int p,int l,int r){
T[p].l=l,T[p].r=r,T[p].cov=-1;
if(l==r){T[p].mx=a[pred[l]];return;}
build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void updadd(int p,int ql,int qr,int v){
if(ql>T[p].r||qr<T[p].l)return;
if(ql<=T[p].l&&T[p].r<=qr)return pushadd(p,v);
pushdown(p);
if(qr<=mid)updadd(lc,ql,qr,v);
else if(ql>mid)updadd(rc,ql,qr,v);
else updadd(lc,ql,mid,v),updadd(rc,mid+1,qr,v);
pushup(p);
}
inline void updcov(int p,int ql,int qr,int v){
if(ql>T[p].r||qr<T[p].l)return;
if(ql<=T[p].l&&T[p].r<=qr)return pushcov(p,v);
pushdown(p);
if(qr<=mid)updcov(lc,ql,qr,v);
else if(ql>mid)updcov(rc,ql,qr,v);
else updcov(lc,ql,mid,v),updcov(rc,mid+1,qr,v);
pushup(p);
}
inline int query(int p,int ql,int qr){
if(ql>T[p].r||qr<T[p].l)return 0;
if(ql<=T[p].l&&T[p].r<=qr)return T[p].mx;
pushdown(p);
if(qr<=mid)return query(lc,ql,qr);
if(ql>mid)return query(rc,ql,qr);
return max(query(lc,ql,mid),query(rc,mid+1,qr));
}
inline void changeadd(int x,int y,int v){
while(top[x]^top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
updadd(1,num[top[x]],num[x],v),x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
updadd(1,num[y]+1,num[x],v);
}
inline void changecov(int x,int y,int v){
while(top[x]^top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
updcov(1,num[top[x]],num[x],v),x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
updcov(1,num[y]+1,num[x],v);
}
inline int ask(int x,int y){
int ret=0;
while(top[x]^top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ret=max(ret,query(1,num[top[x]],num[x])),x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);
return max(ret,query(1,num[y]+1,num[x]));
}
int main(){
n=read();
for(int u,v,w,i=1;i<n;++i)u=read(),v=read(),w=read(),add(u,v,w),add(v,u,w);
dfs1(1),dfs2(1,1),build(1,1,n);
char s[10];
while(1){
scanf("%s",s);
if(s[0]=='S')break;
int x=read(),y=read();
if(s[0]=='M')printf("%d\n",ask(x,y));
if(s[0]=='C'&&s[1]=='o')changecov(x,y,read());
if(s[0]=='A')changeadd(x,y,read());
if(s[0]=='C'&&s[1]=='h'){
int u=e[x*2].v,v=e[x*2-1].v;
if(dep[u]>dep[v])swap(u,v);
updcov(1,num[v],num[v],y);
}
}
return 0;
}
2018.10.27 bzoj1984: 月下“毛景树”(树链剖分)的更多相关文章
- BZOJ1984: 月下“毛景树”
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 713 Solved: 245[Submit][Status] Descri ...
- [bzoj1984]月下“毛景树”
Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园.毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的" ...
- [BZOJ1984]月下“毛景树”解题报告|树链剖分
Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树” ...
- 【树链剖分】【分块】【最近公共祖先】【块状树】bzoj1984 月下“毛景树”
裸题,但是因为权在边上,所以要先把边权放到这条边的子节点上,然后进行链更新/查询的时候不能更新/查询其lca. #include<cstdio> #include<cmath> ...
- 【BZOJ1984】月下“毛景树” 树链剖分+线段树
[BZOJ1984]月下"毛景树" Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校 ...
- 【BZOJ-1984】月下“毛景树” 树链剖分
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1314 Solved: 416[Submit][Status][Discu ...
- 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”
题面:月下“毛景树” 题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好).用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了:前三个更新的操作都可以合并起来,可以发现a到b节点间 ...
- 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 ...
随机推荐
- JETTY+NGINX
一.Jetty搭建 1)上传jetty.tar,并且解压(支持war和文件夹) [root@localhost home]# tar -xvf jetty.tar [root@localhost ho ...
- 在CentOS7.4上手动编译安装Mysql-5.7.20
实验环境:CentOS 7.4 mysql软件: mysql-boost-5.7.20.tar.gz 1.安装编译工具 yum -y install \ncurses \ncurses-devel \ ...
- Repeater绑定数据 后台自定义的DataTable
前台:<asp:Repeater ID="Repeater1" runat="server"> <ItemTemplat ...
- XML 解析技术
xml 解析方式有两种: dom 解析和 sax 解析: 针对着两种解析方式,有三种解析器: sun公司的 jaxp dom4j 组织的 dom4j jdom 组织的 jdom dom 解析XML : ...
- PHP系统编程--PHP进程信号处理(转)
原地址:https://www.cnblogs.com/linzhenjie/p/5485436.html PHP的pcntl扩展提供了信号处理的功能,利用它可以让PHP来接管信号的处理,在开发服务器 ...
- rbac 权限分配, 基于formset实现,批量增加
这里需要两个知识点: - formset - 自动发现项目中的URL1. 什么是formset: Django中 form组件 或 ModelForm组件,用于做一个表单的验证. 接收前端form表单 ...
- 在pom.xml中引入jar包坐标的依赖范围
A依赖B,需要在A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括: compile:编译范围,指A在编译时依赖B,此范围为默认依赖范围.编译范围的依赖会用在编译.测试.运 ...
- Struts2框架的数据封装一之属性封装(属性封装的第一种方式:对参数进行封装)
request带着参数来,aciton对其进行处理.在学习action之前,使用的是servlet对request进行处理.request请求时会带有参数,所以我们要对这些参数进行封装. 1. 为什么 ...
- Bootstrap 框架 day57
Bootstrap框架 Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包 ...
- laravel中类似于thinkPHP中trace功能
答案来自https://segmentfault.com/q/1010000007716945 一楼: 到 https://packagist.org 上搜索你想要的关键词,比如查debugbar 列 ...