剑雪清寒 @ 2022-07-08 20:18:09
找不出错咧,WA
求助(
#include <bits/stdc++.h>
inline int read() {
int x,f;char ch;
for(f=0;!isdigit(ch=getchar());f=ch=='-');
for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
return f?-x:x;
}
inline void print(long long x,char las) {
if(!x) {
putchar(48),putchar(las);
return ;
}
if(x<0) putchar('-'),x=-x;
int ls[23],k=0;
while(x) ls[++k]=x%10,x/=10;
while(k) putchar(ls[k--]+48);
putchar(las);
return ;
}
struct road{
int u,v;
}rrdd[100001];
int rd_sum=0;
struct edge {
int to,len;
edge *next;
}rd[200000];
edge *head[100001];
struct node {
int value=0,wson=0,size=1,top=0,dfn=0,deep=0,dad=0;
}nd[100001];
struct tree {
int cnt,pre[100001],ss=0;
int lson[400001],rson[400001],va[400001];
inline void update(int x) { va[x]=va[lson[x]]>va[rson[x]] ? va[lson[x]] : va[rson[x]]; }
inline void build(int x,int l,int r) {
ss++;
if(l==r) {
va[x]=pre[l];
return ;
}
int mid=(l+r)>>1;
lson[x]=ss+1;
build(ss+1,l,mid);
rson[x]=ss+1;
build(ss+1,mid+1,r);
update(x);
return ;
}
inline void replace(int x,int l,int r,int now,int re) {
if(l>now || r<now) return ;
if(l==r) {
va[x]=re;
return ;
}
int mid=(l+r)>>1;
replace(lson[x],l,mid,now,re);
replace(rson[x],mid+1,r,now,re);
update(x);
return ;
}
inline int find(int x,int l,int r,int L,int R) {
if(R<L) return 0;
if(l>R || r<L) return 0;
if(l>=L && r<=R) return va[x];
int mid=(l+r)>>1;
return std::max(find(lson[x],l,mid,L,R),find(rson[x],mid+1,r,L,R));
}
}tr1;
inline void dfs1(int x,int dep) {
nd[x].deep=dep;
for(edge *i=head[x];i!=NULL;i=i->next) {
int nex=i->to;
if(nd[nex].deep) continue;
nd[nex].value=i->len;
nd[nex].dad=x;
dfs1(nex,dep+1);
nd[x].size+=nd[nex].size;
if(nd[nex].size>nd[nd[x].wson].size) nd[x].wson=nex;
}
return ;
}
inline void dfs2(int x,int tp) {
nd[x].dfn=++tr1.cnt,tr1.pre[tr1.cnt]=nd[x].value;nd[x].top=tp;
if(nd[x].wson) dfs2(nd[x].wson,tp);
for(edge *i=head[x];i!=NULL;i=i->next) {
int nex=i->to;
if(nd[nex].dfn) continue;
dfs2(nex,nex);
}
return ;
}
int n=read();
inline void change(int i,int t) {
i=nd[rrdd[i].u].deep>nd[rrdd[i].v].deep ? rrdd[i].u : rrdd[i].v;
tr1.replace(1,1,tr1.cnt,nd[i].dfn,t);
return ;
}
inline void query(int u,int v) {
int ans=0;
while(nd[u].top!=nd[v].top) {
if(nd[nd[u].top].deep<nd[nd[v].top].deep) std::swap(u,v);
int as=tr1.find(1,1,tr1.cnt,nd[nd[u].top].dfn,nd[u].dfn);
if(as>ans) ans=as;
u=nd[nd[u].top].dad;
}
if(nd[u].deep>nd[v].deep) std::swap(u,v);
int as=tr1.find(1,1,tr1.cnt,nd[u].dfn+1,nd[v].dfn);
if(as>ans) ans=as;
print(ans,'\n');
return ;
}
int main() {
for(int i=1;i<n;i++) {
int u=read(),v=read();
rrdd[i].u=u,rrdd[i].v=v;
rd[rd_sum].len=read();rd[rd_sum].to=v;rd[rd_sum].next=head[u];head[u]=&rd[rd_sum++];
rd[rd_sum].len=rd[rd_sum-1].len;rd[rd_sum].to=u;rd[rd_sum].next=head[v];head[v]=&rd[rd_sum++];
}
dfs1(1,1);
dfs2(1,1);
tr1.build(1,1,tr1.cnt);
std::string s1;
while(std::cin>>s1) {
if(s1=="DONE") return 0;
if(s1=="CHANGE") change(read(),read());
else query(read(),read());
}
return 0;
}
by 剑雪清寒 @ 2022-07-08 20:27:34
乱改解决问题咧,108行change(int i,int t)
改为change(int t,int i)
就可以了,可是为什么i和t读到的值反了(
by 233L @ 2022-07-08 20:30:46
别在函数的参数里调用函数,特别是快读这种有先后顺序的。我也这么干过,好像顺序会反过来,总之非常不建议(
by 0x3F @ 2022-07-08 20:33:57
@23333ll 准确说是ub
by StarLbright40 @ 2022-07-08 20:35:07
函数调用参数的顺序是不确定的
by 剑雪清寒 @ 2022-08-23 20:08:53
@StarLbright40 草,乱翻自己之前的帖子。能不能问一下您是不是lrx)))