Description

毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园。 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里。爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的“毛景树”下面,发现树上长着他最爱吃的毛毛果~~~ “毛景树”上有N个节点和N-1条树枝,但节点上是没有毛毛果的,毛毛果都是长在树枝上的。但是这棵“毛景树”有着神奇的魔力,他能改变树枝上毛毛果的个数:  Change k w:将第k条树枝上毛毛果的个数改变为w个。  Cover u v w:将节点u与节点v之间的树枝上毛毛果的个数都改变为w个。  Add u v w:将节点u与节点v之间的树枝上毛毛果的个数都增加w个。 由于毛毛虫很贪,于是他会有如下询问:  Max u v:询问节点u与节点v之间树枝上毛毛果个数最多有多少个。

Input

第一行一个正整数N。 接下来N-1行,每行三个正整数Ui,Vi和Wi,第i+1行描述第i条树枝。表示第i条树枝连接节点Ui和节点Vi,树枝上有Wi个毛毛果。 接下来是操作和询问,以“Stop”结束。

Output

对于毛毛虫的每个询问操作,输出一个答案。

Sample Input

4
1 2 8
1 3 7
3 4 9
Max 2 4
Cover 2 4 5
Add 1 4 10
Change 1 16
Max 2 4
Stop

Sample Output

9
16

【Data Range】
1<=N<=100,000,操作+询问数目不超过100,000。
保证在任意时刻,所有树枝上毛毛果的个数都不会超过10^9个。

检查了一个下午...结果竟然是存边的数组大小忘了翻倍了...给跪
这题是树链剖分..区间加和区间覆盖。维护点权变成了维护边权,我们可以把边权存成这条边到达的节点的点权,然后就和做点权的树链剖分一样了。最后两点在一条链的时候上面那个点的点权不需要加入ans。
【依旧是写了300多行的树链剖分】
#include<string>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct line
{int s,t,x;int next;
}a[200001];
int edge;
int head[100001];
inline void add(int s,int t,int x)
{a[edge].next=head[s];head[s]=edge;a[edge].s=s;a[edge].t=t;a[edge].x=x;
}
struct tree
{int l,r;int max;int tag1,tag2;//1cover 2add
}tr[800001];
inline int max(int x,int y)
{if(x>y)return x;return y;
}
inline void up(int p)
{tr[p].max=max(tr[p*2].max,tr[p*2+1].max);//tr[p].s=tr[p*2].s+tr[p*2+1].s;
}
inline void down(int p)
{if(tr[p].tag1!=0){tr[p*2].max=tr[p].tag1;tr[p*2+1].max=tr[p].tag1;tr[p*2].tag1=tr[p].tag1;tr[p*2+1].tag1=tr[p].tag1;tr[p*2].tag2=0;tr[p*2+1].tag2=0;tr[p].tag1=0;tr[p].tag2=0;}else if(tr[p].tag2!=0){if(tr[p*2].tag1!=0&&tr[p*2].l!=tr[p*2].r)down(p*2);if(tr[p*2+1].tag1!=0&&tr[p*2+1].l!=tr[p*2+1].r)down(p*2+1);tr[p*2].max+=tr[p].tag2;tr[p*2+1].max+=tr[p].tag2;tr[p*2].tag2+=tr[p].tag2;tr[p*2+1].tag2+=tr[p].tag2;tr[p].tag2=0;}
}
inline void build(int p,int l,int r)
{tr[p].l=l;tr[p].r=r;tr[p].max=-21000000;if(l!=r){int mid=(l+r)/2;build(p*2,l,mid);build(p*2+1,mid+1,r);}
}
inline void change(int p,int l,int r,int x)
{if(l<=tr[p].l&&tr[p].r<=r){down(p);if(tr[p].max!=-21000000)tr[p].max+=x;elsetr[p].max=x;tr[p].tag2+=x;}else{down(p);int mid=(tr[p].l+tr[p].r)/2;if(l<=mid)change(p*2,l,r,x);if(r>mid)change(p*2+1,l,r,x);up(p);}
}
inline void cover(int p,int l,int r,int x)
{if(l<=tr[p].l&&tr[p].r<=r){//  down(p);tr[p].max=x;tr[p].tag1=x;tr[p].tag2=0;}else{down(p);int mid=(tr[p].l+tr[p].r)/2;if(l<=mid)cover(p*2,l,r,x);if(r>mid)cover(p*2+1,l,r,x);up(p);}
}
inline int find(int p,int l,int r)
{if(l<=tr[p].l&&tr[p].r<=r)return tr[p].max;else{down(p);int mid=(tr[p].l+tr[p].r)/2;int ans=-21000000;if(l<=mid)ans=max(ans,find(p*2,l,r));if(r>mid)ans=max(ans,find(p*2+1,l,r));up(p);return ans;}
}
int dep[100001],size[100001],son[100001],fa[100001];
int top[100001],w[100001];
bool fx[200001];
int lson[100001]/*最大节点位置*/,mson[100001]/*最大节点值*/;
int tot;
int s;
bool vis[100001];
inline void dfs1(int d)
{int i;for(i=head[d];i!=0;i=a[i].next){int t=a[i].t;if(t!=fa[d]&&!vis[t]){// printf("%d\n",t);vis[t]=true;dep[t]=dep[d]+1;fa[t]=d;dfs1(t);son[d]+=son[t]+1;if(son[t]>=mson[d]){mson[d]=son[t];lson[d]=t;}}}
}
inline void dfs2(int d)
{s++;int i;for(i=head[d];i!=0;i=a[i].next){int t=a[i].t;if(t==lson[d]){top[t]=top[d];tot++;w[t]=tot;fx[i]=true;dfs2(t);}}for(i=head[d];i!=0;i=a[i].next){int t=a[i].t;if(t!=fa[d]&&t!=lson[d]){top[t]=t;tot++;w[t]=tot;fx[i]=true;dfs2(t);}}
}
tree xx;
inline int ask(int s,int t)
{int u=top[s],v=top[t];int ans;ans=-21000000;while(u!=v){if(dep[u]>dep[v]){ans=max(ans,find(1,w[u],w[s]));s=fa[top[s]];}else{ans=max(ans,find(1,w[v],w[t]));t=fa[top[t]];}u=top[s];v=top[t];}if(w[s]<w[t])ans=max(ans,find(1,w[s]+1,w[t]));else if(w[s]>w[t])ans=max(ans,find(1,w[t]+1,w[s]));return ans;
}
inline void addx(int s,int t,int xx)
{int u=top[s],v=top[t];int ans;ans=-21000000;while(u!=v){if(dep[u]>dep[v]){change(1,w[u],w[s],xx);s=fa[top[s]];}else{change(1,w[v],w[t],xx);t=fa[top[t]];}u=top[s];v=top[t];}if(w[s]<w[t])change(1,w[s]+1,w[t],xx);else if(w[s]>w[t])change(1,w[t]+1,w[s],xx);
}
inline void cov(int s,int t,int xx)
{int u=top[s],v=top[t];int ans;ans=-21000000;while(u!=v){if(dep[u]>dep[v]){cover(1,w[u],w[s],xx);s=fa[top[s]];}else{cover(1,w[v],w[t],xx);t=fa[top[t]];}u=top[s];v=top[t];}if(w[s]<w[t])cover(1,w[s]+1,w[t],xx);else if(w[s]>w[t])cover(1,w[t]+1,w[s],xx);
}
struct save
{int s,t,x;
}b[100001];
int main()
{
//   freopen("msn.in","r",stdin);
//   freopen("msn.out","w",stdout);int n;scanf("%d",&n);int i,s,t,xx;for(i=1;i<=n-1;i++){scanf("%d%d%d",&b[i].s,&b[i].t,&b[i].x);edge++;add(b[i].s,b[i].t,b[i].x);edge++;add(b[i].t,b[i].s,b[i].x);}dep[1]=1;s=0;vis[1]=true;dfs1(1);top[1]=1;tot++;w[1]=tot;s=0;dfs2(1);build(1,1,n);for(i=1;i<=edge;i++){if(fx[i]){int t=a[i].t;change(1,w[t],w[t],a[i].x);}}char x[101];// string x;int sumx=0;while(1){//scanf("%s",&x);/* cin>>x;int flag;if(x[0]=='M')flag=1;else if(x[0]=='C'){if(x[1]=='o')flag=2;else if(x[1]=='h')flag=4;}else if(x[0]=='A')flag=3;else if(x[0]=='S')break;*/scanf("%s",&x);int flag;if(x[0]=='M')flag=1;else if(x[0]=='C'){if(x[1]=='o')flag=2;else if(x[1]=='h')flag=4;}else if(x[0]=='A')flag=3;else if(x[0]=='S')break;if(flag==1){scanf("%d%d",&s,&t);printf("%d\n",ask(s,t));}else if(flag==2){scanf("%d%d%d",&s,&t,&xx);cov(s,t,xx);}else if(flag==3){scanf("%d%d%d",&s,&t,&xx);addx(s,t,xx);}else if(flag==4){scanf("%d%d",&s,&xx);if(fx[s*2-1]){t=a[s*2-1].t;cover(1,w[t],w[t],xx);}else if(fx[s*2]){t=a[s*2].t;cover(1,w[t],w[t],xx);}}}return 0;
}

bzoj 1984: 月下“毛景树”相关推荐

  1. bzoj 1984: 月下“毛景树” 线段树+树链剖分

    题意 给出一棵n个节点的树,每条边都有权值,要求资瓷以下操作: Max x y表示查询x到y之间的最大权值 Cover x y z表示把x到y的权值赋为z Change x y表示把第x条边的权值变成 ...

  2. BZOJ1984: 月下“毛景树”

    BZOJ 1984: 月下"毛景树" Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 1583  Solved: 500 [Subm ...

  3. [bzoj1984]月下“毛景树” 树链剖分

    1984: 月下"毛景树" Time Limit: 20 Sec  Memory Limit: 64 MB [Submit][Status][Discuss] Descriptio ...

  4. 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”

    题面:月下"毛景树" 题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好).用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了:前三个更新的操作都可以合并起来, ...

  5. P4315 月下“毛景树” (树链剖分)

    题目链接: P4315 月下"毛景树" 大致题意 给定一棵由nnn个节点的树, 由n−1n - 1n−1带权边构成. 有如下444种操作: Change k c: 把第kkk条边的 ...

  6. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  7. [BZOJ1984] 月下“毛景树”

    Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的" ...

  8. 洛谷P4315 月下“毛景树”

    题目描述 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里. 爬啊爬~爬啊爬毛毛虫爬到了一颗小小的"毛景树&quo ...

  9. 【洛谷P4315】月下“毛景树”(树链剖分)

    这是一道毒瘤题. 首先题目中给的是边权而不是点权,但是我们把边权移到点上就行了 但是要注意,之后我们修改u,v两点之间的路径时,就不要修改他们的lca,以及当要修改单边的时候,把边的编号*2(因为是双 ...

  10. 洛谷 P4315 月下“毛景树”(边树剖)

    题目不算难,但是代码量需要控制 主要说一下线段树上的操作,因为有两个相关的区间操作标记,应该先覆盖后增加,因为覆盖操作会影响增加操作 const int N=1e5+5;int n,m;int i,j ...

最新文章

  1. ICCV 2021| GRF: 用于三维表征和渲染的通用神经辐射场(已开源)
  2. 关于内核页表和进程页表的一个问题
  3. 海南大学计算机科学与技术专业考研,2021年海南大学计算机科学与技术(081200)硕士研究生招生信息_考研招生计划和招生人数 - 学途吧...
  4. yml php,使用 docker-compose.yml 快速搭建php开发环境
  5. [Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]
  6. SQL数值计算函数之round(X,D)
  7. 小米路由器r2d_小米路由器R2D刷机变砖维修过程记录
  8. ADT下载地址,完整版
  9. PaddlePaddle深度学习--线性回归
  10. java实现邮箱推送
  11. 阿里云监控列表和内存使用率数据展示为N/A,怎么办?
  12. Linux C程序访问NULL指针
  13.  定义一个变量,是一个三位数,求各个位数的和
  14. 【WCN685X】WCN685X WiFi 6E 6G信道与频宽对应关系
  15. 【WPS表格】数据透视表:修改行列字段顺序
  16. scrapy crawl爬取我爱我家二手房的数据
  17. Python-知识点Demo练习
  18. 2021年全球及中国金融科技行业发展概况及发展趋势分析[图]
  19. 问题 C: LD的神奇魔法
  20. 插件 图片取模软件 支持16位数组 Bmp2RGB

热门文章

  1. QProgressDialog setValue过快导致死机问题记录
  2. 短视频如何打动用户?从人的欲望出发,吸粉引流很简单
  3. 如何在Excel里输入可以打钩的选择框?
  4. java 日语文档翻译_日语文档怎么翻译?我来教会你日语翻译
  5. wordpress建站我们如何选择虚拟主机和VPS服务器呢?
  6. Python学习日记之从Tushare上获取500成分股
  7. 《早起的奇迹》(死过一次的人生赢家)
  8. mysql根据用户经纬度查询附近商家,mysql根据经纬度获取附近的商家
  9. Photoshop快速抠图:使用蒙版工具
  10. 201万年薪,华为天才少年路径可以复制吗