首页 > 其他分享 >AGM资格赛 J.避难所

AGM资格赛 J.避难所

时间:2022-09-22 00:34:00浏览次数:40  
标签:node AGM 资格赛 避难所 mi cnt else int ll

 

#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;
    }
}

 

标签:node,AGM,资格赛,避难所,mi,cnt,else,int,ll
From: https://www.cnblogs.com/liyishui2003/p/16717753.html

相关文章

  • 27. Fragment + ViewPager
    27.Fragment+ViewPager27.1fragment与viewPager的联合应用ViewPager+Fragment形成翻页效果→减少用户的操作。27.2ViewPager2基本应用新的空白工程布局文......
  • 26. Fragment生命周期
    26.Fragment生命周期26.1Fragment生命周期onAttach()/onDetach():绑定/解绑onCreate()/onDestroy():创建/销毁创建时,解析bundleonCreateView()/onDestroyView():对UI......
  • 24. Fragment的产生、使用方法、静态(动态)添加fragment
    24.Fragment的产生、使用方法、静态(动态)添加fragment24.1Fragment的产生Android3.0之后不同的Fragment运行在同一个Activity之上。24.2什么是Fragment具备生命周......
  • 25. Activity与Fragment通信
    25.Activity与Fragment通信25.1Activity与Fragment通信原生方案:Bundle如何让Activity和BlankFragment1完成通信Activity中://定义一个bundleBundlebundle=newB......
  • ViewPager2+Fragment+TabLayout
    ViewPager22019初Google正式发布了ViewPager2。只要我们已经从Suppor库切换到AndroidX,便可以使用ViewPager2完全取代旧的ViewPager。ViewPager2最显著的特点是基于Recycl......
  • android 动态添加 fragment
    按钮点击触发:publicvoidexecute(Viewview)throwsException{FragmentManagerfm=getFragmentManager();FragmentTransactionft=fm.beginT......