首页 > 其他分享 >202400610刷题总结

202400610刷题总结

时间:2024-06-10 12:10:59浏览次数:10  
标签:总结 return int mind 差分 202400610 include maxd 刷题

T1

T559。

T2(带权并查集)

1380。
把行和列的取值看成变量,其中行取1代表+1,列取1代表-1,为了凑x - y = c,这样可以拿并查集来做了。
维护d[x],到根的距离,我们把边定义为+,反向走为-。这样就行了,如果在一个集合,那么判断距离是不是c。
还可以差分约束,dfs(直接遍历一遍,遇到环就判断).

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m, k;
int p[N << 1], d[N];

int find(int x)
{
    if (p[x] == x) return x;
    
    int fa = find(p[x]);
    d[x] += d[p[x]];
    return p[x] = fa;
}

int main()
{
    scanf("%d%d%d", &n, &m, &k);
    for (int i = 1; i <= n + m; i ++ ) p[i] = i;
    while (k -- )
    {
        int x, y, c;
        scanf("%d%d%d", &x, &y, &c);
        y += n;
        int px = find(x), py = find(y);
        if (px != py)
        {
            p[py] = px;
            d[py] = d[x] + c - d[y];
        }
        else if (d[y] - d[x] != c)
        {
            puts("No");
            return 0;
        }
    }
    puts("Yes");
    return 0;
}

T3(带权并查集,与上题类似)

换成乘。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int N = 20010;

int p[N];
double d[N];
int n, m;

int find(int x)
{
    if (p[x] == x) return x;
    int fa = find(p[x]);
    d[x] *= d[p[x]];
    return p[x] = fa;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) p[i] = i, d[i] = 1;
    while (m -- )
    {
        int x, y, a, b;
        scanf("%d%d%d%d", &x, &y, &a, &b);
        int px = find(x), py = find(y);
        if (px != py)
        {
            p[py] = px;
            d[py] = d[x] * a / b / d[y]; 
        }
        else
        {
            if (abs(d[x] - (d[y] * b / a)) >= 1e-5)
            {
                puts("No");
                return 0;
            }
        }
    }
    puts("Yes");
    return 0;
}

T4(差分约束,不等式及相对关系->差分约束)

1129。 https://www.luogu.com.cn/problem/P2474
这个题首先要想到枚举,然而我们不知道他们之间的关系,无法判断。求解相对关系,我们发现a+b = c+d 加法不好处理,这个等式实际上就是a - c = d - b,这样就转化为了求差值的范围,其实就是差分约束。不等式是啥呢?根据给定的图,a-b的关系就给了,floyd求差分约束就行了。最后暴力枚举判断。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110;

int mind[N][N], maxd[N][N];
int n, A, B;
char g[N][N];

void floyd()
{
    for (int k = 1; k <= n; k ++ )
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= n; j ++ )
            {
                mind[i][j] = max(mind[i][j], mind[i][k] + mind[k][j]);
                maxd[i][j] = min(maxd[i][j], maxd[i][k] + maxd[k][j]);
            }
}

int main()
{
    freopen("balance.in", "r", stdin);
	freopen("balance.out", "w", stdout);
    scanf("%d%d%d", &n, &A, &B);
    for (int i = 1; i <= n; i ++ )
    {
        scanf("%s", g[i] + 1);
        for (int j = 1; j <= n; j ++ )
            if (i != j)
            {
                if (g[i][j] == '+') mind[i][j] = 1, maxd[i][j] = 2;
                else if (g[i][j] == '?') mind[i][j] = -2, maxd[i][j] = 2;
                else if (g[i][j] == '-') mind[i][j] = -2, maxd[i][j] = -1;
            }
    }
    floyd();
    int c1 = 0, c2 = 0, c3 = 0;
    for (int i = 1; i <= n; i ++ )
        for (int j = i + 1; j <= n; j ++ )
            if (i != j && i != A && i != B && j != A && j != B)
            {
                if (mind[A][i] > maxd[j][B] || mind[A][j] > maxd[i][B]) c1 ++ ;
                if ((maxd[A][i] == mind[A][i] && maxd[j][B] == mind[j][B] && mind[A][i] == maxd[j][B])
                || (maxd[A][j] == mind[A][j] && maxd[i][B] == mind[i][B] && mind[A][j] == maxd[i][B]))
                    c2 ++ ;
                if (maxd[A][i] < mind[j][B] || maxd[A][j] < mind[i][B]) c3 ++ ;
            }
    
    printf("%d %d %d\n", c1, c2, c3);
    fclose(stdin);
    fclose(stdout);
    return 0;
}

标签:总结,return,int,mind,差分,202400610,include,maxd,刷题
From: https://www.cnblogs.com/qinyiting/p/18240569

相关文章

  • 线性表总结(数据结构C++,大二下写,初学者)
    这段时间,我学到了这门课的第一种数据结构——线性表。关于线性表的知识,我总结为三方面:课本上学到的知识、上机实现课本上的例子的过程所学到的知识和力扣做题学到的知识和技巧。顺序表线性表中第一个学到的是顺序表,为此我翻了一下课本。顺序表,顾名思义,是线性表的顺序存储结构......
  • ChatGPT Prompt技术全攻略-总结篇:Prompt工程技术的未来发展
    系列篇章......
  • 题目4~6总结
    一、前言(1)题目集四输入输出处理:根据题目要求,输入有五种类型的信息,需要解析不同的输入格式。输出也有特定的格式,包括试卷总分警示、答卷信息、判分信息等。这需要编写相应的解析和格式化代码。数据结构设计:需要设计合适的数据结构来存储题目信息、试卷信息、学生信息等。可能的......
  • 课程阶段性总结
    前言:学习Java到了第二个阶段了,通过这几个月的学习,我对Java的了解逐渐深入.但是随着深入学习,我发现编写代码所需要的知识越来越多,就需要我们不断学习更多的知识.通过这几次的大作业,让我成长的非常迅速,为我提供了宝贵的实践机会。我将对题目集的知识点、题量及难度进行简要......
  • MyBatisPlus总结二
    MybatisPlus总结一在这:MybatisPlus总结1/2-CSDN博客六、分页查询:6.1.介绍:        MybatisPlus内置了分页插件,所以我们只需要配置一个分页拦截器就可以了,由于不同的数据库的分页的方式不一样,例如mysql和oracle数据库的写法是完全不一样的,所以我们需要去指定一个数......
  • HTML和CSS每周总结6.7day
    最近学的东西比较简单就没每天发了,下面我总结一下这周学的东西,最近端午节了祝大家端午节快乐。一,5.311.标签字体加粗:<b></b>   字体倾斜:<i></i>   下划线:<u></u>   删除线:<s></s>title网页标题 段落标签:<p></p> 换行标签:<br/> 字体标签:<fontcolor="......
  • 2024-6-9 面试总结
    1.上来先拷打项目,关于项目是怎么实现的,以及判题模块代码的编译和进行等等.2.询问过使用什么软件了,完成了什么东西等等.3.演示了一下python模型实验,关于金融知识图谱.4.根据我项目前端用到的MarkDown编辑器,扩展给我们讲解了一下关于医院病历前端的编辑器5.讲解了X86ARM6......
  • 对4-6次pta的总结
    【1】.前言这三次的pta难度还是比较高的,尤其是第四次的(根本没有思绪),考察了较多的正则表达式的使用,以及对类的设计有一些要求,第五次的pta难度一般,主要考察的是类的书写,并不需要太多关于类的设计,第六次的pta是在第五次的基础上进行迭代,增加了并联电路,难度还是有的。【2】.设计与......
  • 4~6题目集总结
    1.前言:知识点方面,涵盖了抽象类的定义、特点、作用,以及迭代相关的各种概念,如不同迭代器的使用等。题量适中,能够充分检验对这些知识点的理解和掌握程度。既包括对抽象类基本概念的直接考查,也有通过实际代码情境来分析的题目,还有涉及到与迭代结合运用的综合题。难度呈阶梯式分布。......
  • PTA第四次到第六次题目集总结
    PTA第四次到第六次题目集总结前言 第四次到第六次题目集的题目难度总的来说其实比第一次到第三次题目集的难度要稍小一点,因为第四次题目集总的来说就是在第三次题目集上做了一点拓展,增加了选择题和填空题两种题型,而第五次题目集开始就是一种新的背景的题目,以电路为背景,由于是理......