最小生成树<lct>

题解:

lct动态维护最小生成树

每次加边时若这两个之间不连通,那么直接连接

如果这两个点联通,那么就找到这条边上的最大值

如果这个大于当前边,就替换掉

但是需要注意的是lct只能维护点,不能维护边

所以可以把边弄成点

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 500000
ll n,m,num,root,data[maxn],fa[maxn],
leftson[maxn],rightson[maxn];
ll v[maxn],aa[maxn],bb[maxn];
bool rev[maxn];
void down(ll x)
{
  if (!rev[x]) return;
  swap(leftson[x],rightson[x]); rev[x]=0;
  rev[leftson[x]]^=1; rev[rightson[x]]^=1; 
}
int se(int x,int y,int z)
{
  if (v[x]>=v[y]&&v[x]>=v[z]) return(x);
  else if (v[y]>=v[x]&&v[y]>=v[z]) return(y);
  else return(z);
}
void updata(ll x)
{
    down(x);
    data[x]=se(x,data[leftson[x]],data[rightson[x]]);
}
void pushr(ll x)
{
  rev[x]^=1;
}
bool pd(ll x)
{
  ll y=fa[x];
  if (leftson[y]!=x&&rightson[y]!=x) return(false);
  else return(true);
}
void rotate(ll x,ll y)
{
  ll father=fa[x];
  if (y==1)
  {
    rightson[father]=leftson[x];
    if (leftson[x]) fa[leftson[x]]=father;
  } else
  {
    leftson[father]=rightson[x];
    if (rightson[x]) fa[rightson[x]]=father;
  }
  fa[x]=fa[father];
  if (pd(father))
  {
    if (leftson[fa[father]]==father) 
      leftson[fa[father]]=x; else
      rightson[fa[father]]=x;
  }
  fa[father]=x;
  if (y==1) leftson[x]=father; else rightson[x]=father;
  updata(father); updata(x);
}
void dfs(ll x)
{
  if (pd(x)) dfs(fa[x]);
  down(x);
}
void splay(ll x)
{
  dfs(x);
  ll father=fa[x];
  while (pd(x))
  {
    if (!pd(father))
    {
      if (x==leftson[father]) rotate(x,2);
      else rotate(x,1);
    } else
    {
      if (father==leftson[fa[father]])
      {
        if (x==leftson[father]) 
          rotate(father,2),rotate(x,2);
        else rotate(x,1),rotate(x,2);
      } else
      {
        if (x==rightson[father])
          rotate(father,1),rotate(x,1);
        else rotate(x,2),rotate(x,1);
      }
    }
    father=fa[x];
  }
}
void access(ll x)
{
  for (ll y=0;x;y=x,x=fa[x])
    splay(x),rightson[x]=y,updata(x);
}
void makeroot(ll x)
{
  access(x);
  splay(x);
  pushr(x);
}
ll findroot(ll x)
{
  access(x);
  splay(x);
  while (leftson[x]) x=leftson[x];
  return x;
}
void split(ll x,ll y)
{
  makeroot(x);
  access(y);
  splay(y);
}
void link(ll x,ll y)
{
  makeroot(x);
  if (findroot(y)!=x) fa[x]=y;
}
void cut(ll x,ll y)
{
  makeroot(x);
  split(x,y);
  fa[x]=leftson[y]=0;
}
int main()
{
  freopen("noip.in","r",stdin);
  freopen("noip.out","w",stdout);
  cin>>n>>m;
  int c,d,e;
  int cnt=0,num=0;
  for (int i=1;i<=m;i++)
  {
      cin>>c>>d>>e;
      makeroot(c);
    if (findroot(d)==c)
    { 
        split(c,d);
        int d1=data[d];
        if (v[d1]>e)
        {
          cut(aa[d1],d1); cut(bb[d1],d1); num-=(v[d1]-e);
          link(c,i+n); link(i+n,d); v[i+n]=e;
          aa[i+n]=c; bb[i+n]=d;
        }
      } else
      {
        cnt++; link(c,i+n); link(i+n,d); v[i+n]=e;
        aa[i+n]=c; bb[i+n]=d; num+=e;
    }
  }
  cout<<num;
  return 0;
}

 

转载于:https://www.cnblogs.com/yinwuxiao/p/8452394.html

<think>好的,我现在需要帮助用户分析他们提供的XML配置文件,判断是否能够解决他们下午提到的问题。不过用户没有具体说明下午的问题是什么,这让我有点困惑。首先,我需要回顾这个配置文件的内容,看看里面有什么设置可能常见的问题相关。 这个XML文件看起来是一个Windows服务的配置,服务名为LCT_REDIS6.2.6,执行文件是GarnetServer.exe,并带有参数--lua。日志路径指向%BASE%\serviceLogs,启动模式是手动。用户的问题是修改这个配置文件是否能解决他们之前的问题,但缺少具体的问题描述。 考虑到用户之前可能遇到的问题,我需要推测可能的场景。比如,服务无法启动、参数配置错误、日志记录问题,或者Lua支持相关的问题。例如,如果下午的问题是GarnetServer在启动时没有启用Lua支持,那么添加--lua参数是正确的做法。或者,如果服务启动模式不正确,修改startmode可能有效。 另外,用户可能遇到路径问题,比如日志目录不存在导致服务启动失败,这时候需要确认logpath是否正确,并且目录是否有写入权限。还有可能服务名称冲突,导致无法安装或启动,修改id和name可能有帮助。 但因为没有具体的错误信息,我只能基于常见问题进行分析。建议用户提供更多关于下午问题的细节,比如错误日志、具体症状,这样才能更准确地判断配置文件修改是否有效。同时,检查配置文件中的路径是否正确,参数是否适用于GarnetServer,以及服务安装是否正确等步骤也是必要的。</think>根据您提供的XML配置文件,这是一个Windows服务配置,用于通过$GarnetServer.exe$运行Redis 6.2.6兼容服务。要判断能否解决您下午的问题,需要结合您下午遇到的具体问题来分析: \#\# 配置文件关键参数解析 1. `<arguments>--lua</arguments>` 表示启用了Lua脚本支持,如果下午的问题$Lua$功能缺失有关(如执行Lua脚本报错),这个参数会生效 2. `<logpath>%BASE%\serviceLogs</logpath>` 如果下午的问题需要日志分析,请检查该目录是否生成日志文件 3. `<startmode>Manual</startmode>` 表示服务启动模式为手动,如果下午遇到服务自动启动冲突,这个配置可避免 \#\# 常见问题对应解决方案 $$\begin{cases} \text{若服务无法启动} & \rightarrow \text{检查GarnetServer.exe路径是否正确} \\ \text{若Lua脚本不执行} & \rightarrow \text{已通过--lua参数启用支持} \\ \text{若端口冲突} & \rightarrow \text{需添加--port参数指定端口} \\ \text{若权限不足} & \rightarrow \text{需检查服务运行账户权限} \end{cases}$$ \#\# 建议验证步骤 1. 使用管理员权限执行: $$\text{sc create LCT\_REDIS6.2.6 binPath= "\%BASE\%\GarnetServer.exe --lua"}$$ 2. 检查服务状态: $$\text{sc query LCT\_REDIS6.2.6}$$ 3. 查看日志目录: $$\%BASE\%\text{\\serviceLogs\\*.log}$$ *注:由于您未提供下午问题的具体错误现象,建议补充以下信息以便更精准判断:* - 服务启动时报错代码 - 客户端连接时的具体错误提示 - Redis命令执行异常现象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值