AGM资格赛 J.避难所

 

复制代码
#include<bits/stdc++.h>
using namespace std;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((l+r)>>1)
const int N= int(1e5)+17;
typedef long long ll;
int n,q,cnt=0;
ll vis[N],sta[N],_end[N],id[N],idd[N],a[N],f[N];
vector<int>e[N];
struct node{
    ll lz,cnt,mi;
    friend node operator + (node x,node y){
        if(x.mi==y.mi) return (node){0,x.cnt+y.cnt,x.mi};
        else if(x.mi<y.mi) return (node){0,x.cnt,x.mi};
        else return (node){0,y.cnt,y.mi};
    }
}t[N<<2];
void pd(int rt){
          t[ls].lz+=t[rt].lz;t[rs].lz+=t[rt].lz;
       t[ls].mi+=t[rt].lz;t[rs].mi+=t[rt].lz;
       t[rt].lz=0; 
}
void pushup(int rt){
    t[rt]=t[ls]+t[rs];
}
void add(int rt,int l,int r,int ql,int qr,ll val){
    if(ql<=l&&r<=qr){
        t[rt].lz+=val;
        t[rt].mi+=val;
        return;
    }
    pd(rt);
    if(ql<=mid) add(ls,l,mid,ql,qr,val);
    if(mid<qr) add(rs,mid+1,r,ql,qr,val);
    pushup(rt);
}
void modify(int rt,int l,int r,int id,ll val){
    if(l==r){
        t[rt].cnt=val;
        return;
    }
    pd(rt);
    if(id<=mid) modify(ls,l,mid,id,val);
    else modify(rs,mid+1,r,id,val);
    pushup(rt);
}
void dfs(int u,int fa){
    cnt++;sta[u]=cnt;
    id[cnt]=u;idd[u]=cnt;
    vis[u]=1;
    for(int i=0;i<e[u].size();i++){
        int to=e[u][i];
        if(to==fa||vis[to]) continue;
        dfs(to,u);
    }
    _end[u]=cnt;
}
void build(int rt,int l,int r){
    if(l==r){
        t[rt].mi=0;
        t[rt].cnt=a[id[l]];
        t[rt].lz=0;
        return;
    }
    build(ls,l,mid);build(rs,mid+1,r);
    pushup(rt);
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0); 
cout.tie(0);
    //freopen("lys.in","r",stdin);
       cin>>n>>q;
       for(int i=1;i<n;i++){
           int u,v;
          cin>>u>>v;e[u].push_back(v);e[v].push_back(u);    
    }
    for(int i=1;i<=n;i++) cin>>a[i];
    dfs(1,0);
    build(1,1,n);
    for(int i=1;i<=q;i++){
        int op;
        cin>>op;
        if(op==1){
            int x,y;cin>>x>>y;
            modify(1,1,n,idd[x],y);
        }
        else {
            int x;
            cin>>x;
            if(f[x]==0) add(1,1,n,sta[x],_end[x],1);
            else add(1,1,n,sta[x],_end[x],-1);
            f[x]^=1;
        }
        if(t[1].mi==0) cout<<t[1].cnt<<endl;
        else cout<<0<<endl;
    }
}
复制代码

 

posted @   liyishui  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示