关于CE
  • 板块灌水区
  • 楼主忘怜城羡
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/4/28 22:22
  • 上次更新2024/4/29 13:31:41
查看原帖
关于CE
374756
忘怜城羡楼主2024/4/28 22:22

此题代码,C++17会编译错误,但是C++14编译就可以通过,并且过题,这是为什么?

#include<bits/stdc++.h>
using namespace std;
const int MAXN=4e5+7;
bitset<61> tree[MAXN<<3];
vector<int> g[MAXN];
int size[MAXN],dep[MAXN],mp[MAXN],f[MAXN],c[MAXN],tot,lazytag[MAXN<<3];
void pushdown(int p)
{
	tree[p*2].reset();
	tree[p*2+1].reset();
	tree[p*2].set(lazytag[p]);
	tree[p*2+1].set(lazytag[p]);
	lazytag[p*2]=lazytag[p];
	lazytag[p*2+1]=lazytag[p];
	lazytag[p]=0;
	return ;
}
bitset<61> query(int p,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
		return tree[p];
	int mid=(l+r)>>1;
	if(lazytag[p])
		pushdown(p); 
	bitset<61> ans;
	ans.reset();
	if(x<=mid)
		ans|=query(p*2,l,mid,x,y);
	if(mid<y)
		ans|=query(p*2+1,mid+1,r,x,y);
	return ans;
}
void change(int p,int l,int r,int x,int y,int v)
{
	if(x<=l&&r<=y)
	{
		tree[p].reset();
		tree[p].set(v);
		lazytag[p]=v;
		return ;
	}
	int mid=(l+r)>>1;
	if(lazytag[p])
		pushdown(p);
	if(x<=mid)
		change(p*2,l,mid,x,y,v);
	if(mid<y)
		change(p*2+1,mid+1,r,x,y,v);
	tree[p]=tree[p*2]|tree[p*2+1];
	return ;
}
void build(int p,int l,int r)
{
	if(l==r)
	{
		tree[p].set(c[f[l]]);
		return ;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	tree[p]=tree[p*2]|tree[p*2+1];
	return ;
}
void dfn(int x)
{
	mp[x]=++tot;
	f[tot]=x;
	for(int i(0);i<g[x].size();++i)
		if(!mp[g[x][i]])
			dfn(g[x][i]);
	return ;
}
void dfs(int x,int from)
{
	size[x]++;
	for(int i(0);i<g[x].size();++i)
	{
		if(g[x][i]==from)
			continue;
		dfs(g[x][i],x);
		size[x]+=size[g[x][i]];
	}
	return ;
}
int main()
{
	int n,q;
	scanf("%d%d",&n,&q);
	for(int i(1);i<=n;++i)
	{
		int x;
		scanf("%d",&x);
		c[i]=x;
	}
	for(int i(1);i<n;++i)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(1,1);
	dfn(1);
	build(1,1,tot);
	while(q--)
	{
		int opt,u,c;
		scanf("%d",&opt);
		if(opt==1)
		{
			scanf("%d%d",&u,&c);
			change(1,1,tot,mp[u],mp[u]+size[u]-1,c);
		}
		else
		{
			scanf("%d",&u);
			printf("%d\n",query(1,1,tot,mp[u],mp[u]+size[u]-1).count());
		}
//		for(int i(1);i<=tot;++i)
//		{
//			bitset<61> s;
//			s=query(1,1,tot,mp[i],mp[i]);
//			for(int j(1);j<=60;++j)
//				if(s[j])
//				{
//					printf("%d ",j);
//					break;
//				}
//		}
//		printf("\n");
	}
	return 0;
}
2024/4/28 22:22
加载中...