社区讨论
为什么有的程序厌氧
学术版参与者 3已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @m4npkjmr
- 此快照首次捕获于
- 2024/12/14 13:00 去年
- 此快照最后确认于
- 2024/12/14 16:06 去年
rt
交了一份 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 条回复,欢迎继续交流。
正在加载回复...