社区讨论
蒟蒻求调(re on#1)
P4114Qtree1参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjudhf9
- 此快照首次捕获于
- 2025/11/04 08:39 4 个月前
- 此快照最后确认于
- 2025/11/04 08:39 4 个月前
不知道为什么在dfs2中会重复遍历同一个点。
CPP#include<bits/stdc++.h>
#define N 1000005
#define lson u<<1
#define rson (u<<1)|1
using namespace std;
typedef pair<int,int> pii;
int n,vistime=0;
int a[N],d[N],dfn[N],rdfn[N],fa[N],wc[N],siz[N],top[N];
struct road{
int u,v;
}ro[N];
vector<pii> e[N];
void dfs1(int,int);
void dfs2(int,int);
struct node{
int l,r;
int maxn;
}tr[N*4];
void build(int,int,int);
inline void pushup(int);
void modify(int,int,int);
int query_link(int,int);
int query(int,int,int);
signed main()
{
cin>>n;
for(int i=1,u,v,c;i<=n;i++)
{
scanf("%d%d%d",&u,&v,&c);
ro[i]={u,v};
e[u].push_back({v,c});
e[v].push_back({u,c});
}
dfs1(1,0);
dfs2(1,1);
build(1,1,n);
char s[10];
int x,y;
// cout<<vistime<<endl<<endl;
while(scanf("%s",(s+1))!=EOF)
{
if(s[1]=='D') break;
scanf("%d%d",&x,&y);
if(s[1]=='C')
{
int u=ro[x].u,v=ro[x].v;
x=d[u]>d[v]?u:v;
modify(1,dfn[x],y);
}
else if(s[1]=='Q')
{
if(x==y){
printf("0\n");
continue;
}
printf("%d\n",query_link(x,y));
}
}
return 0;
}
void dfs1(int x,int father)
{
siz[x]=1;
fa[x]=father;
d[x]=d[father]+1;
for(int i=0;i<(int)e[x].size();i++)
{
int y=e[x][i].first,c=e[x][i].second;
if(y==fa[x]) continue;
a[y]=c;
dfs1(y,x);
siz[x]+=siz[y];
if(siz[y]>siz[wc[x]]) wc[x]=y;
}
}
void dfs2(int x,int TOP)
{
// if(dfn[x]) return; 没有这行会重复遍历
dfn[x]=++vistime;
rdfn[vistime]=x;
top[x]=TOP;
if(wc[x])
{
dfs2(wc[x],TOP);
for(int i=0;i<(int)e[x].size();i++)
{
int y=e[x][i].first;
if(y==fa[x]||y==wc[x]) continue;
dfs2(y,y);
}
}
}
void build(int u,int l,int r)
{
tr[u]={l,r};
if(l==r)
{
tr[u].maxn=a[rdfn[l]];
return;
}
int mid=(l+r)/2;
build(lson,l,mid);
build(rson,mid+1,r);
pushup(u);
}
inline void pushup(int u)
{
tr[u].maxn=max(tr[lson].maxn,tr[rson].maxn);
}
void modify(int u,int pos,int c)
{
if(tr[u].l==tr[u].r)
{
tr[u].maxn=c;
return;
}
int mid=(tr[u].l+tr[u].r)/2;
if(pos<=mid) modify(lson,pos,c);
else modify(rson,pos,c);
pushup(u);
}
int query(int u,int l,int r)
{
if(l>r) return 0;
if(tr[u].l>=l&&tr[u].r<=r) return tr[u].maxn;
int mid=(tr[u].l+tr[u].r)/2;
int ans=0;
if(l<=mid) ans=max(ans,query(lson,l,r));
if(r>mid) ans=max(ans,query(rson,l,r));
return ans;
}
int query_link(int u,int v)
{
int ans=0;
while(top[u]!=top[v])
{
if(d[top[v]]>d[top[u]]) swap(u,v);
ans=max(ans,query(1,dfn[top[u]],dfn[u]));
u=fa[top[u]];
}
if(dfn[u]==dfn[v]) return ans;
return max(ans,query(1,min(dfn[u],dfn[v])+1,max(dfn[u],dfn[v])));
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...