本机过编提交re
查看原帖
本机过编提交re
210719
Violet___Evergarden楼主2021/11/27 15:58

rt,洛谷绑定了账号提交还是waiting,去官网交的

#include <iostream>
#include <cstring>
using namespace std;
const int kMaxN=1e4+1;
struct SPLF
{
  int size,deep,father,heavyson,top,newid;
}s[kMaxN*2];
struct XDS
{
  int l,r;
  int val,tag;
}tr[kMaxN*4];
int ti,n;
struct EDGE
{
  int to,nt,dis;
}e[kMaxN*2];
int hd[kMaxN],cnt,num;
int f[kMaxN],t[kMaxN];
int a[kMaxN],b[kMaxN];
void Build(int where,int l,int r)
{
  tr[where].l=l;
  tr[where].r=r;
  tr[where].tag=1e9;
  if(l==r)
  {
    tr[where].val=b[l];
    return;
  }
  int mid=(l+r)/2;
  Build(where*2,l,mid);
  Build(where*2+1,mid+1,r);
  tr[where].val=max(tr[where*2].val,tr[where*2+1].val);
}
void Update(int where,int l,int r,int k)
{
  if(tr[where].l>=l&&tr[where].r<=r)
  {
    tr[where].val=k;
    return;
  }
  int mid=(tr[where].l+tr[where].r)/2;
  if(mid>=l)
  {
    Update(where*2,l,r,k);
  }
  if(mid<r)
  {
    Update(where*2+1,l,r,k);
  }
  tr[where].val=max(tr[where*2].val,tr[where*2+1].val);
}
int Get_Max(int where,int l,int r)
{
  if(tr[where].l>=l&&tr[where].r<=r)
  {
    return tr[where].val;
  }
  int mid=(tr[where].l+tr[where].r)/2,ans=0;
  if(mid>=l)
  {
    ans=max(ans,Get_Max(where*2,l,r));
  }
  if(mid<r)
  {
    ans=max(ans,Get_Max(where*2+1,l,r));
  }
  tr[where].val=max(tr[where*2].val,tr[where*2+1].val);
  return ans;
}
void Add(int a,int b,int c)
{
  e[++cnt].to=b;
  e[cnt].nt=hd[a];
  hd[a]=cnt;
  e[cnt].dis=c;
}
void dfs1(int now,int last)
{
  s[now].father=last;
  s[now].deep=s[last].deep+1;
  s[now].size=1;
  int maxa=-1;
  for(int i=hd[now];i;i=e[i].nt)
  {
    if(e[i].to==last)continue;
    a[e[i].to]=e[i].dis;
    dfs1(e[i].to,now);
    s[now].size+=s[e[i].to].size;
    if(s[e[i].to].size>maxa)
    {
      maxa=s[e[i].to].size;
      s[now].heavyson=e[i].to;
    }
  }
}
void dfs2(int now,int top)
{
  s[now].top=top;
  s[now].newid=++num;
  b[num]=a[now];
  if(!s[now].heavyson)return;
  dfs2(s[now].heavyson,top);
  for(int i=hd[now];i;i=e[i].nt)
  {
    if(e[i].to==s[now].father||e[i].to==s[now].heavyson)continue;
    dfs2(e[i].to,e[i].to);
  }
}
int Get(int x,int y)
{
  int ans=0;
  while(s[x].top!=s[y].top)
  {
    if(s[s[x].top].deep<s[s[y].top].deep)
    {
      swap(x,y);
    }
    ans=max(ans,Get_Max(1,s[s[x].top].newid,s[x].newid));
  }
  if(s[x].deep>s[y].deep)
  {
    swap(x,y);
  }
  ans=max(ans,Get_Max(1,s[x].newid+1,s[y].newid));
  return ans;
}
signed main()
{
cin>>ti;
while(ti--)
{
  cin>>n;
  cnt=0;
  memset(e,0,sizeof(e));
  memset(s,0,sizeof(s));
  memset(tr,0,sizeof(tr));
  memset(hd,0,sizeof(hd));
  for(int i=1;i<n;i++)
  {
    int c;
    cin>>f[i]>>t[i]>>c;
    Add(f[i],t[i],c);
    Add(t[i],f[i],c);
  }
  dfs1(1,0);
  dfs2(1,1);
  Build(1,1,n);
  string op;
  while(cin>>op)
  {
    if(op=="DONE")break;
    int x,y;
    cin>>x>>y;
    if(op=="CHANGE")
    {
      int where;
      if(s[f[x]].deep>s[t[x]].deep)where=s[f[x]].newid;
      else where=s[t[x]].newid;
      Update(1,where,where,y);
    }
    else
    {
      cout<<Get(x,y)<<"\n";
    }
  }
}
return 0;
}
2021/11/27 15:58
加载中...