CF 766D 带权并查集

该博客详细解析了Codeforces比赛766D题目,涉及带权并查集的数据结构。题目要求处理单词间的关系(喜欢、不喜欢),并根据关系进行查询,输出关系状态。博主分享了实现代码,并邀请读者交流讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CF 766D 带权并查集

题目大意:
给你N个单词M段关系还有Q个询问,关系包括喜欢和不喜欢;对于输入的每段关系,输出“YES”代表不矛盾,“NO”代表矛盾,若这两个单词没有关系则按输入的关系为它们建立关系并输出YES;对于每个询问,如果这两个单词没关系输出3 同义词输出1 反义词输出2 **【带权并查集裸题】******欢迎大佬多多指教!

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<string>
using namespace std;
int n,m,q;
typedef long long LL;
const int N=1e5+10;
int fa[N];
int R[N];                            //设定同义词R[i]=0 反义词R[i]=1
char a[30],b[30];
map<string,int>M;
int fi(int x)                          //路径压缩
{
    if(x!=fa[x])
    {
          int t=fa[x];
        fa[x]=fi(fa[x]);
        R[x]=(R[t]+R[x])%2;
    }
    return fa[x];
}
int main()
{
    while(~scanf("%d%d%d",&n,&m,&q))
    {
        for(int i=1;i<=n;i++)
        {
            fa[i]=i;
            R[i]=0;
        }
        int op;
        for(int i=0;i<n;i++)
        {
            scanf("%s",a);
            M[a]=i+1;                  //字符串转化为数字
        }
        for(int i=0;i<m;i++)
        {
            int fx,fy;
            scanf("%d%s%s",&op,a,b);
            fx=fi(M[a]);
            fy=fi(M[b]);
            if(op==1)
            {
                if(fx==fy)                                                 //祖先相同
                {
                    if((R[M[a]]-R[M[b]]+2)%2==0)
                        printf("YES\n");
                    else
                        printf("NO\n");
                }
                else                                                 //祖先不同 将两棵树连起来
                {
                    fa[fy]=fx;
                    R[fy]=(R[M[b]]-R[M[a]]+2)%2;
                    printf("YES\n");
                }
            }
            else
            {
                if(fx==fy)
                {
                    if((R[M[a]]-R[M[b]]+3)%2==0)
                        printf("YES\n");
                    else
                        printf("NO\n");
                }
                else
                {
                    fa[fy]=fx;
                    R[fy]=(R[M[a]]-R[M[b]]+3)%2;
                    printf("YES\n");
                }
            }
        }
        while(q--)
        {
               scanf("%s%s",a,b);
           int fx=fi(M[a]),fy=fi(M[b]);
           if(fx!=fy)
                printf("3\n");
           else
           {
               printf("%d\n",(R[M[a]]+R[M[b]])%2+1);
           }
        }
    }
}
### n8n 的中文资料与社区资源 #### 中文文档 n8n 提供了丰富的官方文档,虽然主要以英文为主,但仍可以通过翻译工具获取详细的指导。对于希望阅读中文内容的用户,可以参考以下链接并结合在线翻译工具完成学习[^1]: - **官方文档**: [https://docs.n8n.io/](https://docs.n8n.io/) 这里涵盖了从安装到高级使用的全部内容。 如果需要更贴近本地化的支持,可以关注一些第三方整理的内容或博客文章,这些通常会提供更加直观的学习体验。 --- #### 中文教程 针对 n8n 的具体使用场景和技术细节,有专门的中文系列教程可供参考。以下是几个重要的教程方向及其覆盖范围[^2][^3]: 1. **选择适合的 n8n 安装部署方式** - 配置环境变量的关键参数包括 `N8N_PORT`、`N8N_PROTOCOL` 和 `GENERIC_TIMEZONE` 等。 - 生产环境中推荐启用基本身份验证 (`N8N_BASIC_AUTH_ACTIVE`) 并设置强密码。 2. **自动化平台深度解析** - 解读 n8n 的核心优势:极简部署、服务集成能力以及 AI 工作流的支持。 - 结合实际案例分析如何利用 n8n 实现复杂业务逻辑。 通过以上教程,能够快速掌握 n8n 的基础操作和进阶技巧。 --- #### 中文社区 为了更好地交流经验和支持彼此解决问题,n8n 用户可以在以下几个渠道找到活跃的中文社区成员: 1. **社区论坛**: - 地址: [https://community.n8n.io/](https://community.n8n.io/) - 虽然该论坛的主要语言为英语,但在其中搜索关键词加上 “Chinese” 或者直接提问时注明自己来自中国地区,往往也能获得及时的帮助。 2. **国内技术分享站点**: - 像掘金 (Juejin)、知乎等平台上也有不少关于 n8n 使用心得的文章发布。 3. **社交媒体群组**: - 微信/QQ 技术讨论小组可能隐藏着许多宝贵的经验教训;尝试加入相关主题的兴趣圈子可能会有意想不到收获。 --- ```bash # 示例命令:启动带有特定配置的 Docker 容器运行 n8n docker run \ -e N8N_PORT=5678 \ -e N8N_PROTOCOL=https \ -e N8N_HOST=mydomain.com \ -e GENERIC_TIMEZONE=Asia/Shanghai \ -e N8N_BASIC_AUTH_ACTIVE=true \ -e N8N_BASIC_AUTH_USER=admin \ -e N8N_BASIC_AUTH_PASSWORD=mypassword \ n8nio/n8n ``` 上述脚本展示了如何依据之前提到过的那些重要环境变量来定制化自己的实例部署过程[^2]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值