社区讨论

TLE on #54求救!

CF620ENew Year Tree参与者 3已保存回复 3

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@lobp9dck
此快照首次捕获于
2023/10/30 00:42
2 年前
此快照最后确认于
2023/11/04 05:23
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define N 400010
#define re register
#define map unordered_map
int first[N],nxt[N<<1],to[N<<1],cnt;
inline void add(re int u,re int v){
    to[++cnt]=v;nxt[cnt]=first[u];
    first[u]=cnt;
}
int dfn[N],siz[N],pre[N],a[N],tot;
void dfs(re int u,re int fa){
    siz[u]=1;dfn[u]=++tot;pre[tot]=u;
    for(re int i=first[u];i;i=nxt[i]){
        int v=to[i];
        if(v==fa) continue;
        dfs(v,u);
        siz[u]+=siz[v];
    }
}

namespace Fastio{
    namespace Fread{
        const int SIZE=(1<<21);
        char buf[SIZE],*S,*T;
        inline char getchar(){
            if(S==T){
                T=(S=buf)+fread(buf,1,SIZE,stdin);
                if(S==T) return '\n';
            }
            return *S++;
        }
    }
    namespace Fwrite{
        const int SIZE=(1<<21);
        char buf[SIZE],*S=buf,*T=buf+SIZE;
        inline void flush(){fwrite(buf,1,S-buf,stdout);S=buf;}
        inline void putchar(register char c){*S++=c;if(S==T) flush();}
        struct NTR{~NTR(){flush();}}ztr;
    }
    #ifdef ONLINE_JUDGE
    #define getchar Fread::getchar
    #define putchar Fwrite::putchar
    #endif
    struct Reader{
        template<typename T>
        Reader &operator>>(register T&x){
            register char c=getchar();
            register T dp=1;
            while(c<'0'||c>'9'){if(c=='-') dp=-1;c=getchar();}
            x=0;
            while(c>='0'&&c<='9') x=x*10+(c-'0'),c=getchar();
            x*=dp;
            return *this;
        }
        Reader &operator>>(register char &c){
            c=getchar();
            while(c==' '||c=='\n') c=getchar();
            return *this;
        }
        Reader &operator>>(register char *str){
            register int len=0;
            register char c=getchar();
            while(c==' '||c=='\n') c=getchar();
            while(c!=' '&&c!='\n'&&c!='\r') str[len++]=c,c=getchar();
            str[len]='\0';
            return *this;
        }
        inline Reader(){}
    }cin;
    const char endl='\n';
    struct Writer{
        template<typename T>
        Writer &operator<<(T x){
            if(!x){putchar('0');return *this;}
            if(x<0) putchar('-'),x=-x;
            static int sta[111];
            register int top=0;
            while(x) sta[++top]=x%10,x/=10;
            while(top) putchar(sta[top]+'0'),--top;
            return *this;
        }
        Writer &operator<<(register char c){putchar(c);return *this;}
        Writer &operator<<(register char *str){register int cur=0;while(str[cur]) putchar(str[cur++]);return *this;}
        Writer &operator<<(register const char *str){register int cur=0;while(str[cur]) putchar(str[cur++]);return *this;}
        inline Writer(){}
    }cout;
    #define cin Fastio::cin
    #define cout Fastio::cout
    #define endl Fastio::endl
}
using namespace Fastio;
#define lc p<<1
#define rc p<<1|1
map<int,int> col[N<<2];
int lazy[N<<2];
inline void pushup(re int p){
    // col[p].clear();
    col[p]=col[rc];
    auto lt=col[lc].begin();
    for(lt;lt!=col[lc].end();lt++) col[p][lt->first]++;
    // for(rt;rt!=col[rc].end();rt++) col[p][rt->first]++;
}
inline void pushnow(re int p,re int v){
    col[p].clear();col[p][v]++;lazy[p]=v;
}
inline void pushdown(re int p){
    if(lazy[p]){
        pushnow(lc,lazy[p]);
        pushnow(rc,lazy[p]);
        lazy[p]=0;
    }
}
inline void build(re int p,re int l,re int r){
    if(l==r) return void(col[p][a[pre[l]]]++);
    int mid=l+r>>1;
    build(lc,l,mid);
    build(rc,mid+1,r);
    pushup(p);
}
inline void update(re int p,re int l,re int r,re int ql,re int qr,re int v){
    if(ql<=l&&r<=qr) return pushnow(p,v);
    pushdown(p);
    re int mid=l+r>>1;
    if(ql<=mid) update(lc,l,mid,ql,qr,v);
    if(qr>mid) update(rc,mid+1,r,ql,qr,v);
    return pushup(p);
}
inline map<int,int> query(re int p,re int l,re int r,re int ql,re int qr){
    if(ql<=l&&r<=qr) return col[p];
    pushdown(p);
    re int mid=l+r>>1;
    if(qr<=mid) return query(lc,l,mid,ql,qr);
    if(ql>mid) return query(rc,mid+1,r,ql,qr);
    auto ll=query(lc,l,mid,ql,qr),ans=query(rc,mid+1,r,ql,qr);
    for(auto it=ll.begin();it!=ll.end();++it) ans[it->first]++;
    return ans;
}
inline int rd(){
    char c=getchar();int v=0;
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9') v=(v<<3)+(v<<1)+(c^48),c=getchar();
    return v;
}
int main(){
    freopen("1.in","r",stdin);
    re int n,m;cin>>n>>m;
    for(re int i=1;i<=n;++i) cin>>a[i];
    for(re int i=1;i<n;++i){
        re int x,y;cin>>x>>y;
        add(x,y);add(y,x);
    }
    ++m;
    dfs(1,0);build(1,1,n);
    while(--m){
        re int op;cin>>op;
        if(op==1){
            re int u,c;cin>>u>>c;
            update(1,1,n,dfn[u],dfn[u]+siz[u]-1,c);
        }
        else {re int u;cin>>u;cout<<query(1,1,n,dfn[u],dfn[u]+siz[u]-1).size()<<endl;}
    }
    return 0;
}

回复

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

正在加载回复...