bzoj 1984: 月下“毛景树”
Description
Input
Output
Sample Input
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
16
【Data Range】
1<=N<=100,000,操作+询问数目不超过100,000。
保证在任意时刻,所有树枝上毛毛果的个数都不会超过10^9个。
#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: 月下“毛景树”相关推荐
- bzoj 1984: 月下“毛景树” 线段树+树链剖分
题意 给出一棵n个节点的树,每条边都有权值,要求资瓷以下操作: Max x y表示查询x到y之间的最大权值 Cover x y z表示把x到y的权值赋为z Change x y表示把第x条边的权值变成 ...
- BZOJ1984: 月下“毛景树”
BZOJ 1984: 月下"毛景树" Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1583 Solved: 500 [Subm ...
- [bzoj1984]月下“毛景树” 树链剖分
1984: 月下"毛景树" Time Limit: 20 Sec Memory Limit: 64 MB [Submit][Status][Discuss] Descriptio ...
- 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”
题面:月下"毛景树" 题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好).用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了:前三个更新的操作都可以合并起来, ...
- P4315 月下“毛景树” (树链剖分)
题目链接: P4315 月下"毛景树" 大致题意 给定一棵由nnn个节点的树, 由n−1n - 1n−1带权边构成. 有如下444种操作: Change k c: 把第kkk条边的 ...
- 洛谷P4315 月下“毛景树” 题解
洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...
- [BZOJ1984] 月下“毛景树”
Description 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里.爬啊爬~爬啊爬~~毛毛虫爬到了一颗小小的" ...
- 洛谷P4315 月下“毛景树”
题目描述 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里. 爬啊爬~爬啊爬毛毛虫爬到了一颗小小的"毛景树&quo ...
- 【洛谷P4315】月下“毛景树”(树链剖分)
这是一道毒瘤题. 首先题目中给的是边权而不是点权,但是我们把边权移到点上就行了 但是要注意,之后我们修改u,v两点之间的路径时,就不要修改他们的lca,以及当要修改单边的时候,把边的编号*2(因为是双 ...
- 洛谷 P4315 月下“毛景树”(边树剖)
题目不算难,但是代码量需要控制 主要说一下线段树上的操作,因为有两个相关的区间操作标记,应该先覆盖后增加,因为覆盖操作会影响增加操作 const int N=1e5+5;int n,m;int i,j ...
最新文章
- ICCV 2021| GRF: 用于三维表征和渲染的通用神经辐射场(已开源)
- 关于内核页表和进程页表的一个问题
- 海南大学计算机科学与技术专业考研,2021年海南大学计算机科学与技术(081200)硕士研究生招生信息_考研招生计划和招生人数 - 学途吧...
- yml php,使用 docker-compose.yml 快速搭建php开发环境
- [Leetcode][第410题][JAVA][分割数组的最大值][动态规划][二分]
- SQL数值计算函数之round(X,D)
- 小米路由器r2d_小米路由器R2D刷机变砖维修过程记录
- ADT下载地址,完整版
- PaddlePaddle深度学习--线性回归
- java实现邮箱推送
- 阿里云监控列表和内存使用率数据展示为N/A,怎么办?
- Linux C程序访问NULL指针
- 	定义一个变量,是一个三位数,求各个位数的和
- 【WCN685X】WCN685X WiFi 6E 6G信道与频宽对应关系
- 【WPS表格】数据透视表:修改行列字段顺序
- scrapy crawl爬取我爱我家二手房的数据
- Python-知识点Demo练习
- 2021年全球及中国金融科技行业发展概况及发展趋势分析[图]
- 问题 C: LD的神奇魔法
- 插件 图片取模软件 支持16位数组 Bmp2RGB