菜鸡死于此树下
  • 板块P3401 洛谷树
  • 楼主Myano
  • 当前回复10
  • 已保存回复10
  • 发布时间2023/6/6 16:23
  • 上次更新2023/10/23 13:50:01
查看原帖
菜鸡死于此树下
1010254
Myano楼主2023/6/6 16:23

自认为可读性很强的码风QAQ

可以帮我调一下吗qwq,不知道为什么RE了

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e4+10;
struct node{int s[11],g[11],l,r;}t[N<<2];
int n,m,key[N],top[N],ct[N],fa[N],dep[N],hs[N],dfn[N],nfd[N];
vector<pair<int,int>>e[N];
void dfs1(int u)
{
    int v;
    ct[u]=1;dep[u]=dep[fa[u]]+1;
    for(auto x:e[u])if((v=x.first)!=fa[u])
    {
        fa[v]=u;key[v]=x.second;
        dfs1(v);ct[u]+=ct[v];
        hs[u]=ct[v]>ct[hs[u]]?v:hs[u];
    }
    return;
}
void dfs2(int u,int T)
{
    top[u]=T;dfn[u]=++dfn[0];nfd[dfn[0]]=u;
    if(hs[u])dfs2(hs[u],T);
    for(auto x:e[u])if(x.first!=hs[u]&&x.first!=fa[u])dfs2(x.first,x.first);
    return;
}
void dfs(int u,int now)
{
    key[u]=(now^=key[u]);
    for(auto x:e[u])if(x.first!=fa[u])dfs(x.first,now);
    return;
}
void split(int u,int val)
{
    int k=0;
    do{t[u].s[k++]=(val&1);val>>=1;
    }while(val);
    return;
}
void pushup(int u)
{
    for(int i=0;i<=10;i++)t[u].s[i]=t[u<<1].s[i]+t[u<<1|1].s[i];
    return;
}
void Opp(int u,int k)
{
    t[u].s[k]=t[u].r-t[u].l+1-t[u].s[k];
    t[u].g[k]++;
    return;
}
void pushdown(int u)
{
    for(int i=0;i<=10;i++){
        if(t[u<<1].g[i]<t[u].g[i]&&(t[u<<1].g[i]&1)!=(t[u].g[i]&1))Opp(u<<1,i);
        if(t[u<<1|1].g[i]<t[u].g[i]&&(t[u<<1|1].g[i]&1)!=(t[u].g[i]&1))Opp(u<<1|1,i);}
    return;
}
void Build(int u,int L,int R)
{
    t[u].l=L;t[u].r=R;
    if(L==R){split(u,key[nfd[L]]);return;}
    int mid=L+R>>1;
    Build(u<<1,L,mid);Build(u<<1|1,mid+1,R);
    pushup(u);
    return;
}
int qry1(int u,int k,int L,int R)
{
    if(t[u].r<L||t[u].l>R)return 0;
    if(t[u].l>=L&&t[u].r<=R)return t[u].s[k];
    pushdown(u);
    int mid=t[u].l+t[u].r>>1,ret=0;
    if(mid>=L)ret+=qry1(u<<1,k,L,R);if(mid+1<=R)ret+=qry1(u<<1|1,k,L,R);
    pushup(u);
    return ret;
}
int qry2(int u,int aim)
{
    if(t[u].l==aim&&t[u].r==aim)return u;
    pushdown(u);
    int mid=t[u].l+t[u].r>>1,ret=0;
    if(mid>=aim)ret=qry2(u<<1,aim);else ret=qry2(u<<1|1,aim);
    pushup(u);
    return ret;
}
void mdf(int u,int k,int L,int R)
{
    if(t[u].l>R||t[u].r<L)return;
    if(t[u].l>=L&&t[u].r<=R){Opp(u,k);return;}
    pushdown(u);
    int mid=t[u].l+t[u].r>>1;
    if(mid>=L)mdf(u<<1,k,L,R);if(mid+1<=R)mdf(u<<1|1,k,L,R);
    pushup(u);
    return;
}
void update(int u,int aim)
{
    if(t[u].l==aim&&t[u].r==aim)return;
    int mid=t[u].l+t[u].r>>1;
    if(mid>=aim)update(u<<1,aim);else update(u<<1|1,aim);
    pushup(u);
    return;
}
int lca(int x,int y)
{
    if(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        x=fa[top[x]];
    }
    if(dep[x]<dep[y])return x;
    else return y;
}
int query(int x,int y)
{
    int o[11]={},ret=0,dis=dep[x]+dep[y]-(dep[lca(x,y)]<<1)+1;
    while(top[x]!=top[y])
    {
        if(dep[top[x]]<dep[top[y]])swap(x,y);
        for(int i=0;i<=10;i++)o[i]+=qry1(1,i,dfn[top[x]],dfn[x]);
        x=fa[top[x]];
    }
    if(dep[x]<dep[y])swap(x,y);
    for(int i=0;i<=10;i++)o[i]+=qry1(1,i,dfn[y],dfn[x]);
    for(int i=0;i<=10;i++)ret+=1ll*(1<<i)*o[i]*(dis-o[i]);
    return ret;
}
void modify(int u,int val)
{
    int old=qry2(1,u);
    memset(t[0].s,0,sizeof(t[0].s));split(0,val);
    for(int i=0;i<=10;i++)if(t[0].s[i]!=t[old].s[i])mdf(1,i,dfn[u],dfn[u]+ct[u]-1);
    memset(t[old].s,0,sizeof(t[old].s));
    split(old,val);update(1,old);
    return;
}
signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<n;i++)
    {
        int x,y,z;
        scanf("%lld%lld%lld",&x,&y,&z);
        e[x].push_back(make_pair(y,z));e[y].push_back(make_pair(x,z));
    }
    dfs1(1);dfs2(1,1);dfs(1,0);Build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int opt,x,y,z;
        scanf("%lld%lld%lld",&opt,&x,&y);
        if(opt==1)printf("%lld\n",query(x,y));
        else if(opt==2)scanf("%lld",&z),modify(max(dfn[x],dfn[y]),z);
    }
    system("pause");
    return 0;
}
2023/6/6 16:23
加载中...