社区讨论
萌妹子刚学oi1ms 10pts 玄关求条
P4315月下“毛景树”参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhj0sewb
- 此快照首次捕获于
- 2025/11/03 18:51 4 个月前
- 此快照最后确认于
- 2025/11/03 18:51 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
#define double long double
#define fi first
#define se second
#define pii pair<int,int>
#define endl '\n'
using namespace std;
const int N=1e5+10;
int n;
int a[N],aa[N];
vector<int>g[N];
int hson[N],sz[N],fa[N];
void dfs1(int u,int f){
fa[u]=f;
hson[u]=-1;
sz[u]=1;
int mx=0;
for(auto v:g[u])if(v!=f){
dfs1(v,u);
mx=max(mx,sz[v]);
if(sz[v]==mx){
hson[u]=v;
}
sz[u]+=sz[v];
}
return ;
}
int dep[N],top[N],dfn[N],rdfn[N],no=1;
void dfs2(int u,int tp){
dep[u]=dep[fa[u]]+1;
top[u]=tp;
dfn[u]=no;
rdfn[no]=u;
no++;
if(sz[u]==1){
return ;
}
dfs2(hson[u],tp);
for(auto v:g[u])if(v!=fa[u]&&v!=hson[u]){
dfs2(v,v);
}
return ;
}
//map<pii,int>mp;
struct node{
int l,r;
int val,lzt1,lzt2=-1;
}t[4*N];
#define lson (id*2)
#define rson ((id*2)+1)
#define mid ((l+r)/2)
void build(int id,int l,int r){
t[id].l=l;
t[id].r=r;
if(l==r){
t[id].val=a[l];
return ;
}
build(lson,l,mid);
build(rson,mid+1,r);
t[id].val=max(t[lson].val,t[rson].val);
return ;
}
#undef mid
void pd(int id){
if(t[id].lzt2>=0){
t[lson].val=t[id].lzt2;
t[rson].val=t[id].lzt2;
t[lson].lzt1=0;
t[rson].lzt1=0;
t[id].lzt2=-1;
}
if(t[id].lzt1){
t[lson].val=max(t[lson].val,t[lson].val+t[id].lzt1);
t[rson].val=max(t[rson].val,t[rson].val+t[id].lzt1);
t[lson].lzt1+=t[id].lzt1;
t[rson].lzt1+=t[id].lzt1;
t[id].lzt1=0;
}
return ;
}
#define mid ((t[id].l+t[id].r)/2)
void add(int id,int l,int r,int k){
if(l<=t[id].l&&r>=t[id].r){
t[id].val+=k;
t[id].lzt1+=k;
return ;
}
pd(id);
if(l<=mid){
add(lson,l,r,k);
}
if(r>mid){
add(rson,l,r,k);
}
t[id].val=max(t[lson].val,t[rson].val);
return ;
}
void change(int id,int l,int r,int k){
if(l<=t[id].l&&r>=t[id].r){
t[id].val=k;
t[id].lzt2=k;
t[id].lzt1=0;
return ;
}
pd(id);
if(l<=mid){
change(lson,l,r,k);
}
if(r>mid){
change(rson,l,r,k);
}
t[id].val=max(t[lson].val,t[rson].val);
return ;
}
int ask(int id,int l,int r){
if(l<=t[id].l&&r>=t[id].r){
return t[id].val;
}
pd(id);
int ans=0;
if(l<=mid){
ans=max(ans,ask(lson,l,r));
}
if(r>mid){
ans=max(ans,ask(rson,l,r));
}
return ans;
}
void coverpath(int u,int v,int k){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]){
swap(u,v);
}
change(1,dfn[top[u]],dfn[u],k);
u=fa[top[u]];
}
if(dep[u]>dep[v]){
swap(u,v);
}
change(1,dfn[u]+1,dfn[v],k);
return ;
}
void addpath(int u,int v,int k){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]){
swap(u,v);
}
add(1,dfn[top[u]],dfn[u],k);
u=fa[top[u]];
}
if(dep[u]>dep[v]){
swap(u,v);
}
add(1,dfn[u]+1,dfn[v],k);
return ;
}
int askpath(int u,int v){
int ans=0;
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]]){
swap(u,v);
}
ans=max(ans,ask(1,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(dep[u]>dep[v]){
swap(u,v);
}
ans=max(ans,ask(1,dfn[u]+1,dfn[v]));
return ans;
}
//map<pii,int>mp2;
int asd[N];
struct Edge{
int u,v,w;
}E[N];
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
g[u].push_back(v);
g[v].push_back(u);
E[i]={u,v,w};
// mp[{u,v}]=w;
// mp2[{u,v}]=i;
}
dfs1(1,0);
dep[1]=1;
dfs2(1,1);
// for(auto i:mp){
// int u=i.fi.fi;
// int v=i.fi.se;
// if(u==fa[v]){
// a[v]=i.se;
// asd[mp2[i.fi]]=v;
// }else{
// a[u]=i.se;
// asd[mp2[i.fi]]=u;
// }
// }
for(int i=1;i<n;i++){
int u=E[i].u,v=E[i].v;
if(dep[u]>dep[v]){
swap(u,v);
}
a[v]=E[i].w;
}
for(int i=1;i<=n;i++){
aa[dfn[i]]=a[i];
}
for(int i=1;i<=n;i++){
a[i]=aa[i];
}
build(1,1,n);
string s;
cin>>s;
while(s!="Stop"){
if(s=="Change"){
int i,w;
cin>>i>>w;
int u=E[i].u,v=E[i].v;
if(dep[u]>dep[v]){
swap(u,v);
}
change(1,dfn[v],dfn[v],w);
}else if(s=="Cover"){
int u,v,w;
cin>>u>>v>>w;
coverpath(u,v,w);
}else if(s=="Add"){
int u,v,w;
cin>>u>>v>>w;
addpath(u,v,w);
}else if(s=="Max"){
int u,v;
cin>>u>>v;
cout<<askpath(u,v)<<endl;
}
cin>>s;
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...