社区讨论
萌新求助 WA #4
P9139[THUPC 2023 初赛] 喵了个喵 II参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mj42gjlq
- 此快照首次捕获于
- 2025/12/13 17:01 2 个月前
- 此快照最后确认于
- 2025/12/15 20:10 2 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m=1,id1[50004],id2[50004],ct[50004],pos[50004][4],ans[200005];
int tot,head[14400007],to[36000007],nxt[36000007];
int idx,tp,cnt,dfn[14400007],low[14400007],vis[14400007],stk[14400007],scc[14400007];
int k,rt[200005],lc[7200006],rc[7200006],id[7200006],od[7200006];
struct node{int id,l,r;}seg[200005];
bool cmp(node a,node b){return a.l==b.l?a.r>b.r:a.l<b.l;}
void tarjan(int u)
{
dfn[u]=low[u]=++idx;
vis[u]=1;stk[++tp]=u;
for(int i=head[u];i;i=nxt[i])
{
int v=to[i];
if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}
else if(vis[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u])
{
cnt++;
for(;;)
{
int v=stk[tp--];
vis[v]=0;scc[v]=cnt;
if(u==v)break;
}
}
}
void add(int u,int v)
{
to[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
void pushup(int u)
{
if(lc[u])
{
add(id[u],id[lc[u]]);
add(od[lc[u]],od[u]);
}
if(rc[u])
{
add(id[u],id[rc[u]]);
add(od[rc[u]],od[u]);
}
}
int update(int u,int l,int r,int p,int w)
{
k++;
lc[k]=lc[u];rc[k]=rc[u];
id[k]=++m;od[k]=++m;u=k;
if(l==r)
{
add(id[u],w);
add(w^1,od[u]);
return u;
}
int mid=l+r>>1;
if(p<=mid)lc[u]=update(lc[u],l,mid,p,w);
else rc[u]=update(rc[u],mid+1,r,p,w);
pushup(u);return u;
}
void query(int u,int l,int r,int L,int R,int w)
{
if(!u)return;
if(r<L||l>R)return;
if(L<=l&&r<=R)
{
add(w,id[u]);
add(od[u],w^1);
return;
}
int mid=l+r>>1;
query(lc[u],l,mid,L,R,w);
query(rc[u],mid+1,r,L,R,w);
}
int main()
{
// freopen("meow.in","r",stdin);
// freopen("meow.out","w",stdout);
cin>>n;
for(int i=1,a;i<=n*4;i++)
{
cin>>a;
pos[a][ct[a]++]=i;
}
for(int i=1;i<=n;i++)
{
id1[i]=++m;
seg[i*4-3]=(node){m,pos[i][0],pos[i][1]};
seg[i*4-2]=(node){m,pos[i][2],pos[i][3]};
id2[i]=++m;
seg[i*4-1]=(node){m,pos[i][0],pos[i][2]};
seg[i*4]=(node){m,pos[i][1],pos[i][3]};
}
sort(seg+1,seg+n*4+1,cmp);
for(int i=1;i<=n*4;i++)
{
query(rt[i-1],1,n*4,seg[i].r,n*4,seg[i].id);
rt[i]=update(rt[i-1],1,n*4,seg[i].r,seg[i].id^1);
}
for(int i=1;i<=m;i++)if(!vis[i])tarjan(i);
for(int i=1;i<=n;i++)
{
if(scc[id1[i]]==scc[id2[i]]){cout<<"No\n";return 0;}
if(scc[id1[i]]<scc[id2[i]])
{
ans[pos[i][0]]=ans[pos[i][2]]=0;
ans[pos[i][1]]=ans[pos[i][3]]=1;
}
else
{
ans[pos[i][0]]=ans[pos[i][1]]=0;
ans[pos[i][2]]=ans[pos[i][3]]=1;
}
}
cout<<"Yes\n";
for(int i=1;i<=4*n;i++)cout<<ans[i];
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...