社区讨论
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 条回复,欢迎继续交流。
正在加载回复...