A

水题一道。
题目的大致意思就是:给你两个集合,求集合间有多少数对和是奇数。

题解,开\(4\)个桶后,求一个\(min\)就可以了。

#include <bits/stdc++.h>
using namespace std;
int n, m;
int v1[4], v2[4];
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1, x; i <= n; i ++) scanf("%d", &x), v1[x % 2] ++;
    for (int i = 1, x; i <= m; i ++) scanf("%d", &x), v2[x % 2] ++;
    cout << min(v1[0], v2[1]) + min(v1[1], v2[0]) << endl;
    return 0;
}

B

题目大意

给你一个数\(x\),并给你两个操作\(A\)和\(B\),要求操作\(A\)和\(B\)必须交替执行。
操作\(A\):给一个\(2^k-1\)异或当前\(x\)。
操作\(B\):将当前的数\(+1\)。
让你在\(40\)步内完成以下的任务:让你把\(x\)变成\(2^k-1\)

题解

水题一道
我们考虑贪心。
首先需要了解操作\(A\)的本质。
其实就是在二进制下异或一个\(111\cdots1\)的数。
那么为了处理到所有的\(0\)变成\(1\),那么我们需要考虑第一个\(0\),也就是在二进制下最高位的\(0\)。
比较明显的贪心策略就出现了,每一次我们异或掉最高位的\(0\),然后\(+1\)。
\(10^{6}\)很明显可以在\(40\)步以内完成,所以不存在无法完成的情况。

代码

#include <bits/stdc++.h>
using namespace std;
int x, n = 0, ans = 0, pos, cnt = 0;
int a[30], Ans[30];
bool fg;
int main() {
    cin >> x;
    for (; x; x >>= 1) a[++ n] = x % 2;
    for (int i = 1; i <= n; i ++) {
        fg = 1;
        for (int j = 1; j <= n; j ++) if (a[j] == 0) { fg = 0; break; }
        if (fg) break;
        for (int j = n; j; j --) {
            if (a[j] == 0) { pos = j; break; }
        }
        for (int j = 1; j <= pos; j ++) a[j] ^= 1;
        Ans[++ cnt] = pos; ++ ans;
        fg = 1;
        for (int j = 1; j <= n; j ++) if (a[j] == 0) { fg = 0; break; }
        if (fg) break;
        a[1] ++;
        for (int j = 1; j <= n; j ++) if (a[j] > 1) a[j] = 0, a[j + 1] ++;
        ++ ans;
    }
    cout << ans << endl;
    for (int i = 1; i <= cnt; i ++) printf("%d ", Ans[i]);
    return 0;
}

C

题目大意

给你\(a\)和\(b\),求最小的\(k\)使\(a+k\)和\(b+k\)的最小公倍数最小。

题解

数论水题一道。
\(lcm(a+k,b+k)=\frac{(a+k)\times (b+k)}{gcd(a+k,b+k)}\)
辗转相减法可得:\(gcd(a+k,b+k)=gcd(a+k,b-a)\)。
那么很明显的是\(b-a\)是一个定值,而且答案和\(b-a\)的约数有关,那么我们就枚举\(b-a\)的约数,然后暴力判断是否满足答案就可以了。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const ll linf = 1ll << 62;
ll a, b, c, ans = linf, ret = linf;
void check(ll x) {
    ll ta = ceil((db)a/x)*x;;
    ll tb = ta + c;
    ll tmp = ta * tb / x;
    if (tmp == ret) {
        if (ta - a < ans) ans = tmp;
    }
    else if (tmp < ret) ans = ta - a, ret = tmp;
}
int main() {
    cin >> a >> b;
    if (a == b) { cout << 0 << endl; return 0; }
    if (a > b) swap(a, b);
    c = b - a; ll sq = sqrt(c);
    for (int i = 1; i <= sq; i ++) {
        if (c % i == 0) { check(i); check(c / i); }
    }
    cout << ans << endl;
    return 0;
}

D

简单DP+结论。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1000 + 4;
const int P = 1e9 + 7;
int n;
ll f[N][N], ans;
int main() {
    cin >> n;
    f[0][0] = 1;
    for (int i = 0; i <= n; i ++) {
        for (int j = 0; j <= i; j ++) {
            if (i && i >= j + 1) f[i][j] += f[i - 1][j];
            if (j) f[i][j] += f[i][j - 1];
            f[i][j] %= P;
        }
    }
    for (int i = 0; i <= n; i ++)
        for (int j = 0; j <= i; j ++)
            if ((i + j) % 2 == 1) ans = (ans + f[i][j]) % P;
    cout << ans << endl;
    return 0;
}

E

题解

其实还是一道水题。。。
比较容易就可以得出题目中给出\(P\)数组是没有用的。
输入中给出的\(b'\)和\(c'\)一定是相邻的两个数。
也就是\({b'}_i\)和\({c'}_i\)是相邻的。

我们需要还原\(a\)数组,也就是需要符合以上所有\(b'\)和\(c'\)的限制。
容易想到就是用欧拉路径实现。

坑点盘点:

  • 建出的图可能不连通。
  • 可能存在环中路径。
  • 需要离散化。

这一道题目是Bluesky大佬教我做的,赶快%

代码

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
const int N = 2e5 + 5;
int a[N], b[N], c[N], d[N], disc[N], de[N], point[N], ans[N];
int n, dcnt = 0, acnt = 0, pcnt = 0;
multiset<int> g[N];
template <typename T> void read(T &x) {
    x = 0; T fl = 1; char ch = 0;
    for (; ch < '0' || ch > '9'; ch = getchar()) if (ch == '-') fl = -1;
    for (; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
    x *= fl;
}
void dfs(int u) {
    if (de[u] == 0) { ans[++ acnt] = u; return; }
    for (auto i = g[u].begin(); i != g[u].end(); i = g[u].begin()) {
        int v = *i;
        g[u].erase(i);
        g[v].erase(g[v].find(u)); de[u] --, de[v] --;
        dfs(v);
    }
    ans[++ acnt] = u;
}
signed main() {
    read(n);
    for (int i = 1; i <= n; i ++) g[i].clear();
    for (int i = 1; i < n; i ++) read(a[i]), disc[++ dcnt] = a[i];
    for (int i = 1; i < n; i ++) read(b[i]), disc[++ dcnt] = b[i];
    for (int i = 1; i < n; i ++) if (a[i] > b[i]) { cout << -1 << endl; return 0; }
    sort(disc + 1, disc + 1 + dcnt);
    dcnt = unique(disc + 1, disc + 1 + dcnt) - disc - 1;
    for (int i = 1; i < n; i ++) {
        c[i] = lower_bound(disc + 1, disc + 1 + dcnt, a[i]) - disc;
        d[i] = lower_bound(disc + 1, disc + 1 + dcnt, b[i]) - disc;
    }
    for (int i = 1; i < n; i ++) {
        g[c[i]].insert(d[i]); g[d[i]].insert(c[i]);
        de[c[i]] ++; de[d[i]] ++;
    }
    for (int i = 1; i <= n; i ++)
        if (de[i] & 1) point[++ pcnt] = i;
    if (pcnt != 0 && pcnt != 2) { cout << -1 << endl; return 0; }
    acnt = 0;
    if (pcnt == 0) dfs(1); else dfs(point[1]);
    if (acnt != n) { cout << -1 << endl; return 0; }
    for (int i = 1; i <= acnt; i ++) printf("%d ", disc[ans[i]]);
    return 0;
}

「CF#554 div2」题解的更多相关文章

  1. 「Sdchr 的邀请赛」题解

    骗个访问量.. A:取石子 将点 x 与点 x / prime 连边,那么这个图可以由指数之和的奇偶性来划分成一个二分图. 接下来考虑推广阶梯 NIM (或者这原本就是阶梯 NIM ?),必胜当且仅当 ...

  2. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  3. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  4. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  5. Note -「圆方树」学习笔记

    目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Touris ...

  6. LOJ6000 - 「网络流 24 题」搭配飞行员

    原题链接 题意简述 求二分图的最大匹配. 题解 这里写的是匈牙利算法. 表示节点的当前匹配. 为真表示在这一轮匹配中,无法给节点一个新的匹配.所以如果为真就不用再dfs它了,直接continue就好. ...

  7. 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)

    [COGS2652]秘术「天文密葬法」(长链剖分,分数规划) 题面 Cogs 上面废话真多,建议直接拉到最下面看一句话题意吧: 给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σa ...

  8. 【刷题】LOJ 6227 「网络流 24 题」最长k可重线段集问题

    题目描述 给定平面 \(\text{xoy}\) 上 \(n\) 个开线段组成的集合 \(\text{I}\) ,和一个正整数 \(k\) ,试设计一个算法. 从开线段集合 \(\text{I}\) ...

  9. 【LOJ121】「离线可过」动态图连通性

    [LOJ121]「离线可过」动态图连通性 题面 LOJ 题解 线段树分治的经典应用 可以发现每个边出现的时间是一个区间 而我们每个询问是一个点 所以我们将所有边的区间打到一颗线段树上面去 询问每个叶子 ...

随机推荐

  1. 简述ADO.NET命名空间

    system.data命名空间的类型 system.data命名空间的核心成员 命名空间 作用 Constraint  表示某个DataColumn对象的约束 DataColumn 表示某个DataT ...

  2. mysql-16进制、十进制互转

    先截取左边4位,再转换: conv(left(t1.DEVICEID, 4), 16, 10)      //转十进制 conv(left(t1.DEVICEID, 4), 10, 16)      ...

  3. 2.python中self详解(程序适用于python3版本)

    先介绍下Python中的类和实例面向对象最重要的概念就是类(class)和实例(instance),类(class)是抽象的模板,比如学生这个抽象的事物,可以用一个Student类来表示.而实例是根据 ...

  4. Yii2设计模式——设计模式简介

    我们首先来思考一个问题:作为工程师,我们的价值是什么? 笔者认为是--解决用户问题. 我们的任何知识和技能,如果不能解决特定的问题,那么就是无用的屠龙之术:我们的任何经验,如果不能对解决新的问题有用, ...

  5. MongoDB学习(查找文档和其他数据查找操作)

    理解Cursor对象和查询运算符 cursor对象 cursor对象相当于一个指针,可通过迭代它来访问MongdoDB数据库中的一组对象. 在使用 find() 方法查询时,返回的并非实际文档,而是一 ...

  6. async await详解

    async await本身就是promise + generator的语法糖. 本文主要讲述以下内容 async awiat 实质 async await 主要特性 async await 实质 下面 ...

  7. Linux网络基本网络配置方法介绍

    网络信息查看 设置网络地址: cat /etc/sysconfig/network-scripts/ifcfg-eth0 你将会看到: DEVICE=eth0BOOTPROTO=staticsHWAD ...

  8. 最新git源码下载地址

    1.最新git源码下载地址: https://github.com/git/git/releases https://www.kernel.org/pub/software/scm/git/ 可以手动 ...

  9. QC API全系列揭秘之Test Execution操作(全网首发)

    (原创文章,转载请注明出处.) 一.QC简介: Quality Center存在至今已经走过了10多个年头,名字从一开始的TD,到后来的QC,再到现在的ALM.所属公司从开始的Mercury到现在的H ...

  10. RabbitMQ消息模型概览(简明教程)

    小菜最近用到RabbitMQ,由于之前了解过其他消息中间件,算是有些基础,所以随手从网上搜了几篇文章,准备大概了解下RabbitMQ的消息模型,没想到网上文章千篇一律,写一大堆内容,就是说不明白到底怎 ...