萌新求调树剖,样例 AC 提交 WA
查看原帖
萌新求调树剖,样例 AC 提交 WA
923947
_sunkuangzheng_楼主2023/7/24 11:04

rt,调了 1.5h 了 qwq

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 5e5+5;
struct edge{int to,nxt,w,u;}e[maxn];int cnt,n,u,v,w,tot,id[maxn],val[maxn],head[maxn],fa[maxn],top[maxn],son[maxn],siz[maxn],dep[maxn];
void add(int u,int v,int w){e[++cnt].to = v,e[cnt].u = u,e[cnt].w = w,e[cnt].nxt = head[u],head[u] = cnt;}
int tag1[maxn],tag2[maxn],t[maxn];string s;
void change1(int s,int l,int r,int k){t[s] = k * (r - l + 1),tag1[s] = k;}
void change2(int s,int l,int r,int k){t[s] += k * (r - l + 1),tag2[s] += k;}
void push_down(int s,int l,int r){
    if(tag1[s] != -1) change1(s*2,l,(l+r)/2,tag1[s]),change1(s*2+1,(l+r)/2+1,r,tag1[s]),tag1[s] = -1;
    change2(s*2,l,(l+r)/2,tag2[s]),change2(s*2+1,(l+r)/2+1,r,tag2[s]),tag2[s] = 0;
}
void update(int s,int l,int r,int ql,int qr,int k,int tp){
    if(ql <= l && r <= qr) return (tp == 1 ? change1(s,l,r,k) : change2(s,l,r,k)),void();
    int mid = (l + r) / 2;push_down(s,l,r);
    if(ql <= mid) update(s*2,l,mid,ql,qr,k,tp); if(qr > mid) update(s*2+1,mid+1,r,ql,qr,k,tp);
    t[s] = max(t[s*2],t[s*2+1]);
}
int query(int s,int l,int r,int ql,int qr){
    if(ql <= l && r <= qr) return t[s];
    int mid = (l + r) / 2,ans = 0;push_down(s,l,r);
    if(ql <= mid) ans = max(ans,query(s*2,l,mid,ql,qr)); 
    if(qr > mid) ans = max(ans,query(s*2+1,mid+1,r,ql,qr));
    return ans;
}
void dfs1(int u,int fat){
    fa[u] = fat,dep[u] = dep[fat] + 1,siz[u] = 1;
    for(int i = head[u];i;i = e[i].nxt){
        int v = e[i].to;if(v == fat) continue;
        val[v] = e[i].w,dfs1(v,u),siz[u] += siz[v];if(siz[v] > siz[son[u]]) son[u] = v;
    }
}
void dfs2(int u,int tp){
    top[u] = tp,id[u] = ++tot,update(1,1,n,tot,tot,val[u],1);if(son[u]) dfs2(son[u],tp);
    for(int i = head[u];i;i = e[i].nxt){int v = e[i].to;if(v != fa[u] && v != son[u]) dfs2(v,v);}
}
void updatee(int u,int v,int k,int tp){
    while(top[u] != top[v]){
        if(dep[top[u]] < dep[top[v]]) swap(u,v);
        update(1,1,n,id[top[u]],id[u],k,tp),u = fa[top[u]];
    }
    if(u == v) return ;
    if(dep[u] > dep[v]) swap(u,v);
    update(1,1,n,id[u]+1,id[v],k,tp);
}
int queryy(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,query(1,1,n,id[top[u]],id[u])),u = fa[top[u]];
    }
    if(u == v) return ans;
    if(dep[u] > dep[v]) swap(u,v);
    return max(ans,query(1,1,n,id[u]+1,id[v]));
}
signed main(){
    cin >> n;memset(tag1,-1,sizeof(tag1));
    for(int i = 1;i < n;i ++) cin >> u >> v >> w,add(u,v,w),add(v,u,w);
    dfs1(1,0),dfs2(1,1);
    while(cin >> s){
        if(s[0] == 'S') break;
        if(s[0] == 'C' && s[1] == 'h') cin >> u >> v,updatee(e[u*2].u,e[u*2].to,v,1);
        if(s[0] == 'C' && s[1] == 'o') cin >> u >> v >> w,updatee(u,v,w,1);
        if(s[0] == 'A') cin >> u >> v >> w,updatee(u,v,w,2);
        if(s[0] == 'M') cin >> u >> v,cout << queryy(u,v) << "\n";
    }
    return 0;
}
2023/7/24 11:04
加载中...