社区讨论

站外题求调

灌水区参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo28qwxq
此快照首次捕获于
2023/10/23 09:50
2 年前
此快照最后确认于
2023/11/03 10:04
2 年前
查看原帖
样例输入
5 5
1 2
1 3
3 4
3 5
1 4 5 3
2 4
1 2 3 2
2 3
2 1
样例输出
3
11
15
样例一直不过
CPP
#pragma GCC optimize(2,3,"Ofast")
#include <bits/stdc++.h>
#define Frr(i,s,e,...) for(int i=s,##__VA_ARGS__;i<=e;++i)
#define Drr(i,s,e,...) for(int i=s,##__VA_ARGS__;i>=e;--i)
#define Fpp(i,u) for(int i=head[u];i;i=edge[i].nxt)
#define Fee(it,arr) for(auto &it:arr)
#define Tc int T; T=rd() while (T--)
#define Mem(arr,x) memset(arr,x,sizeof(arr))
#define lowbit(x) (x&(~x+1))
#define ff first
#define ss second
#define pb emplace_back
#define LL long long
// #define int long long
using namespace std;
template<class T> inline bool chkmax(T &x,T y) {return (x<y)&&(x=y);}
template<class T> inline bool chkmin(T &x,T y) {return (x>y)&&(x=y);}
inline void Print_if(bool sth,string s1="Yes",string s2="No") {sth?cout<<s1:cout<<s2;}
inline int rd() {int x=0,sgn=false; char ch=getchar(); while(ch<'0'||ch>'9') sgn|=ch=='-',ch=getchar(); while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); return sgn?~x+1:x;}
inline void wr(char ch) {putchar(ch);}
inline void wr(char s[]) {while(*s) putchar(*s++);}
inline void wr(int x) {static char ch[20]; int p=0; if(x<0) putchar('-'),x=~x+1; do ch[++p]=(x%10)^48,x/=10; while(x); while(p) putchar(ch[p--]);}
template<class T,class... U> inline void wr(T x,U ...t) {wr(x),wr(t...);}
// --------------------------Template Above------------------------------
const int N=2e5+10;
struct Edge{int to,nxt;}edge[N<<1];
int n,m;
int tot,head[N];
int tt,son[N],top[N],sz[N],fa[N],L[N],R[N],id[N],dep[N];
#define mid (l+r>>1)
int tr[N<<2],tag[N<<2];
inline void add_edge(int u,int v) {
    edge[++tot]={v,head[u]},head[u]=tot;
    edge[++tot]={u,head[v]},head[v]=tot;
}
inline void dfs(int u=1,int fa_=0) {
    #define v edge[i].to
    sz[u]=1,fa[u]=fa_,id[u]=L[u]=++tt,dep[u]=dep[fa_]+1;
    Fpp(i,u) if(v!=fa_) dfs(v,u),sz[u]+=sz[v],(sz[son[u]]<sz[v])&&(son[u]=v);
    R[u]=tt;
    #undef v
}
inline void redfs(int u=1,int top_=1) {
#define v edge[i].to
    top[u]=top_;
    if(son[u]) redfs(son[u],top_);
    Fpp(i,u) if(v!=fa[u]&&v!=son[u]) redfs(v,v);
#undef v
}
inline void up(int x) {tr[x]=tr[x<<1]+tr[x<<1|1];}
inline void down(int x,int l,int r) {
    tr[x<<1]+=tag[x]*(mid-l+1),tr[x<<1|1]+=tag[x]*(r-mid);
    tag[x<<1]+=tag[x],tag[x<<1|1]+=tag[x],tag[x]=0;
}
inline void modify(int L,int R,int w,int x=1,int l=1,int r=n) {
    if(L>r||R<l) return ;
    if(L<=l&&R>=r) tr[x]+=w*(r-l+1),tag[x]+=w;
    else down(x,l,r),modify(L,R,w,x<<1,l,mid),modify(L,R,w,x<<1|1,mid+1,r),up(x);
}
inline int query(int L,int R,int x=1,int l=1,int r=n) {
    if(L>r||R<l) return 0;
    if(L<=l&&R>=r) return tr[x];
    else return down(x,l,r),query(L,R,x<<1,l,mid)+query(L,R,x<<1|1,mid+1,r);
}
inline void modify_range(int x,int y,int w) {
    while(top[x]!=top[y]) (dep[top[x]]<dep[top[y]])&&(x^=y^=x^=y),modify(id[top[x]],id[x],w),x=fa[top[x]];
    (dep[x]>dep[y])&&(x^=y^=x^=y),modify(id[x],id[y],w);
}
inline int query_range(int x) {
    return query(L[x],R[x]);
}
signed main() {
    n=rd(),m=rd();
    Frr(i,1,n-1) add_edge(rd(),rd());
    dfs(),redfs();
    Frr(i,1,m) rd()==1?modify_range(rd(),rd(),rd()):wr(query_range(rd()),'\n');
    return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...