社区讨论

为什么有的程序厌氧

学术版参与者 3已保存回复 11

讨论操作

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

当前回复
11 条
当前快照
1 份
快照标识符
@m4npkjmr
此快照首次捕获于
2024/12/14 13:00
去年
此快照最后确认于
2024/12/14 16:06
去年
查看原帖
rt
本人写了一个3KB的屎山
交了一份 c++14的开o2的,结果RE了
然后又交了一份没开o2的,AC了
再然后,又交了一份c++20的,也RE了
还有一份c++20开o2的也是RE
问一下大佬们,什么代码在什么情况会厌氧(如果可以的话可以帮蒟蒻看看代码哪里厌氧了吗qwq
代码:
CPP
#include<bits/stdc++.h>
using namespace std;
#define ls (u<<1)
#define rs (u<<1|1)
const int N=1e5+7;
int n,Q;
int sz[N],wc[N],dep[N],f[N];
int cnt,dfn[N],rdfn[N],top[N];
char ask[N];
vector<int>e[N];
struct node
{
	int l,r;
	int w;
	int tag_1,tag_2;
}tree[N<<2];
void addedge(int u,int v)
{
	e[u].push_back(v);
}
void dfs1(int u,int fa)
{
	dep[u]=dep[fa]+1;
	f[u]=fa;
	sz[u]=1;
	for(int i=0,v;i<e[u].size();i++)
	{
		v=e[u][i];
		if(v!=fa)
		{
			dfs1(v,u);
			sz[u]+=sz[v];
			if(sz[v]>=sz[wc[u]])
			{
				wc[u]=v;
			}
		}
	}
}
void dfs2(int u,int Top)
{
	top[u]=Top;
	dfn[u]=++cnt;
	rdfn[u]=cnt;
	if(wc[u])
	{
		dfs2(wc[u],Top);
		for(int i=0,v;i<e[u].size();i++)
		{
			v=e[u][i];
			if(v!=wc[u]&&v!=f[u])
			{
				dfs2(v,v);
			}
		}
	}
}
void pushup(int u)
{
	tree[u].w=tree[ls].w+tree[rs].w;
}
bool inrange(int L,int R,int l,int r)
{
	return L<=l&&r<=R;
}
bool outrange(int L,int R,int l,int r)
{
	return R<l||r<L;
}
void maketag(int u,int k)
{
	if(k==0)
	{
		return ;
	}
	if(k==1)
	{
		tree[u].w=tree[u].r-tree[u].l+1-tree[u].w;
		tree[u].tag_1^=1;
	}
	else
	{
		tree[u].tag_1=0;
		tree[u].w=0;
		tree[u].tag_2=2;
	}
}
void pushdown(int u)
{
	maketag(ls,tree[u].tag_2),maketag(rs,tree[u].tag_2);
	maketag(ls,tree[u].tag_1),maketag(rs,tree[u].tag_1);
	tree[u].tag_1=tree[u].tag_2=0;
}
void build(int u,int l,int r)
{
	tree[u].l=l,tree[u].r=r;
	if(l==r)
	{
		return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid),build(rs,mid+1,r);
	pushup(u);
}
int query_point(int u,int x)
{
	int l=tree[u].l,r=tree[u].r;
	if(l==r)
	{
		return tree[u].w;
	}
	else
	{
		pushdown(u);
		int mid=(l+r)>>1;
		if(x<=mid)
		{
			return query_point(ls,x);
		}
		else
		{
			return query_point(rs,x);
		}
	}
}
int query(int u,int L,int R)
{
	int l=tree[u].l,r=tree[u].r;
	if(inrange(L,R,l,r))
	{
		return tree[u].w;
	}
	else if(!outrange(L,R,l,r))
	{
		pushdown(u);
		return query(ls,L,R)+query(rs,L,R);
	}
}
void update(int u,int L,int R)
{
	int l=tree[u].l,r=tree[u].r;
	if(inrange(L,R,l,r))
	{
		maketag(u,1);
	}
	else if(!outrange(L,R,l,r))
	{
		pushdown(u);
		update(ls,L,R),update(rs,L,R);
		pushup(u);
	}
}
void update_cover(int u,int L,int R)
{
	int l=tree[u].l,r=tree[u].r;
	if(inrange(L,R,l,r))
	{
		maketag(u,2);
	}
	else if(!outrange(L,R,l,r))
	{
		pushdown(u);
		update_cover(ls,L,R),update_cover(rs,L,R);
		pushup(u);
	}
}
int upd(int u,int k)
{
	int ans=0;
	if(k==1)
	{
		while(1)
		{
			int p=query_point(1,dfn[u]);
			if(p)
			{
				return ans;
			}
			int p_top=query_point(1,dfn[top[u]]);
			if(p!=p_top)
			{
				int len=query(1,dfn[top[u]],dfn[u]);
				int tmp=dfn[u]-dfn[top[u]]+1-len;
				ans+=tmp;
				update(1,dfn[u]-tmp+1,dfn[u]);
			}
			else
			{
				ans+=dfn[u]-dfn[top[u]]+1;
				update(1,dfn[top[u]],dfn[u]);
				u=f[top[u]];
			}
		}
	}
	else
	{
		ans=query(1,dfn[u],dfn[u]+sz[u]-1);
		update_cover(1,dfn[u],dfn[u]+sz[u]-1);
		return ans;
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=2,u;i<=n;i++)
	{
		scanf("%d",&u);
		addedge(u+1,i);
	}
	dfs1(1,1);
	dfs2(1,1);
	build(1,1,n);
	scanf("%d",&Q);
	for(int x;Q;Q--)
	{
		scanf("%s %d",ask,&x);
		x++;
		int ans=upd(x,(ask[0]=='i'?1:0));
		printf("%d\n",ans);
	}
	return 0;
}

回复

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

正在加载回复...