社区讨论
20pts WA 玄关求条
P9638「yyOI R1」youyou 的军训参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m2kc0w2l
- 此快照首次捕获于
- 2024/10/22 18:58 去年
- 此快照最后确认于
- 2025/11/04 16:31 4 个月前
rt
CPP#include<bits/stdc++.h>
using namespace std;
inline int rd()
{
int res=0;
char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))res=res*10+c-'0',c=getchar();
return res;
}
bool sta;
const int N=400050;
int n,m,q,minn;
struct edge{
int x,y,w;
bool operator <(edge a)const{return w>a.w;}
}e[N],e2[N];
struct change{
int x,y;
};
vector<change>stk;
int fa[N<<1],W[N<<1],siz[N<<1],st[N<<1][25],dep[N<<1];
int g[N<<1][2];
int idx;
bool ed;
inline int find(int x)
{
if(fa[x]!=x)fa[x]=find(fa[x]);
return fa[x];
}
inline bool mer(int x,int y,int w)
{
if(find(x)==find(y))return 0;
idx++;
W[idx]=w;
siz[idx]=siz[fa[x]]+siz[fa[y]];
st[fa[x]][0]=st[fa[y]][0]=idx;
g[idx][0]=fa[x];g[idx][1]=fa[y];
fa[fa[x]]=fa[fa[y]]=idx;
return 1;
}
inline void dfs(int x,int d) // 获取 dep
{
dep[x]=d;
if(g[x][0])
{
dfs(g[x][0],d+1);
dfs(g[x][1],d+1);
}
}
inline int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=24;i>=0;i--)
{
if(dep[x]-(1<<i)>=dep[y])
x=st[x][i];
}
if(x==y)return x;
for(int i=24;i>=0;i--)
{
if(st[x][i]!=st[y][i])
{
x=st[x][i];
y=st[y][i];
}
}
return st[x][0];
}
inline int query(int x)
{
for(int i=24;i>=0;i--)
{
if(W[st[x][i]]>=minn)
x=st[x][i];
}
return siz[x];
}
int main()
{
cerr<<(&ed-&sta)/1024.0/1024<<'\n';
n=idx=rd();m=rd();q=rd();
for(int i=1;i<=n*2;i++)fa[i]=i;
fill(siz+1,siz+n+1,1);
for(int i=1;i<=m;i++)
{
e[i].x=e2[i].x=rd();
e[i].y=e2[i].y=rd();
e[i].w=e2[i].w=rd();
}
sort(e+1,e+m+1);
for(int i=1;i<=m;i++)mer(e[i].x,e[i].y,e[i].w);
for(int k=1;k<22;k++)
{
for(int i=1;i<=n*2;i++)
st[i][k]=st[st[i][k-1]][k-1];
}
for(int i=1;i<=n*2;i++)
{
if(fa[i]==i)
dfs(i,1);
}
/*
printf("dep : ");
for(int i=1;i<=n*2;i++)printf("%d ",dep[i]);
puts("");
for(int i=1;i<=n*2;i++)
{
printf("%d (siz = %d , w = %d): ",i,siz[i],W[i]);
for(int k=0;k<=5;k++)printf("%d ",st[i][k]);
puts("");
}*/
int op,x,y;
while(q--)
{
op=rd();
if(op==1)
{
minn=rd();
for(auto j:stk)W[lca(e2[j.x].x,e2[j.x].y)]=j.y;
stk.clear();
}
else if(op==2) // query
{
x=rd();
printf("%d\n",query(x));
}
else { // change
x=rd();y=rd();
stk.push_back((change){x,y});
//W[lca(e2[x].x,e2[x].y)]=y;
}
}
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...