每天一道 CodeForces 构造/思维题 (day4)

简介: 每天一道 CodeForces 构造/思维题 (day4)

题目 And Matching

题目链接 And Matching

题目大意:

在这里插入图片描述

给你一个集合包含0,1,2,, n-1共n(2的整数次幂)个整数,在给你一个数字k(0<=k<=n-1),问能否将这个集合分成n/2组,每组两个整数a和b,并且每组按位与的和等于k?

思路:位运算+构造

这题我刚看到的时候没有上面特别清晰的思路,然后就去推样例,这里给了四个样例

  • 4 00 3,1 2
  • 4 1: 1 3 ,0 2
  • 4 2: 2 3 ,0 1

从这几个样例中我们可以找到一个规律

  • k == 0 :我们可以让每一个x(0<=x<n/2)n-1-x(x的补码)配对,这样总和一定是0
  • 0 < k < n-1 :只需要kn-1配对,0与k的补码配对,剩下的还是原来k==0时的配对
  • k == n - 1:n == 4 时,没有解决方案,n >= 8 时,有很多解决方案:

    -    `n-1`与`n-2`配对,结果是`n-1`
    -   `1`与`n-3`配对,结果是`1`
    -   `0`与`2`配对,结果是`0`
    -   剩下的和k==0时的配对一样

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef priority_queue<int, vector<int>, less<int>> Q;
#define x first
#define y second
const int N = 1e5 + 10;
int match[N];
bool st[N];
void solve()
{
    int n, k;
    int cnt = 0;
    memset(st, 0, sizeof st);
    memset(match, -1, sizeof match);
    cin >> n >> k;
    if (k == n - 1 && n == 4)
    {
        puts("-1");
        return;
    }
    if (k == 0)
    {
        for (int i = 0; i < n / 2; i++)
        {
            cout << i << " " << n - i - 1 << '\n';
        }
        return;
    }
    else if (k < n - 1)
    {
        match[0] = n - k - 1;
        match[n - k - 1] = 0;
        match[k] = n - 1;
        match[n - 1] = k;
    }
    else
    {
        match[n - 1] = n - 2;
        match[n - 2] = n - 1;
        match[n - 3] = 1;
        match[1] = n - 3;
        match[0] = 2;
        match[2] = 0;
    }

    for (int i = 0; i < n / 2; i++)
    {
        if (match[i] != -1)
            continue;
        match[i] = n - i - 1;
        match[n - i - 1] = i;
    }
    for (int i = 0; i < n; i++)
    {
        if (st[i])
            continue;
        st[i] = st[match[i]] = true;
        cout << i << " " << match[i] << '\n';
    }
    return;
}
signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}
相关文章
|
关系型数据库 MySQL 数据库
关系型数据库使用LIMIT子句(在某些数据库中)
`LIMIT` 子句在 MySQL, PostgreSQL, SQLite 等关系型数据库中用于限制查询返回的记录数,常用于分页和限制结果集大小。基本语法为 `SELECT ... FROM table LIMIT number`,可结合 `OFFSET` 实现分页,如 `LIMIT number OFFSET offset_number`。在 MySQL 中,还可直接指定开始和结束位置:`LIMIT start_position, number`。注意,无 `ORDER BY` 时,返回顺序不确定。
394 2
|
1月前
|
人工智能 缓存 自然语言处理
阿里云百炼Token Plan团队版详解:关于套餐与计费规则、支持的模型列表等,一文搞懂
阿里云百炼Token Plan团队版是面向企业/团队的AI大模型订阅服务,以Credits统一计费,支持千问、GLM、DeepSeek等文本模型及Qwen-Image等图像模型,兼容主流编程与Agent工具,提供多档坐席套餐、预算可控、数据安全、稳定不排队等优势。
|
存储 传感器 定位技术
【NI Multisim 14.0原理图设计基础——元器件分类】
一、元器件分类 NI Multisim 14.0不仅提供了数量众多的元器件符号图形,而且还设计了元器件的模型,并分门类地存储在各个元器件库中。下面按照元器件库的命名不同详细介绍常用的元器件。 1.电源库 单击“元器件”工具栏中的“放置源” 按钮,Sources 库的“系列”栏包括以下几种,如图所示: 电源(POWER-SOURCES):包括常用的交直流电源、数字地、地线、星形或三角形连接的三相电源、VCC、VDD、VEE、VSS 电压源,其元器件”栏下内容如图所示: 电压信号源(SIGNAL-VOLTAG…):包括交流电压、时钟电压、脉冲电压、指数电压、FM、AM等多种形式的电压信号,其“元器
21433 3
【NI Multisim 14.0原理图设计基础——元器件分类】
|
3月前
|
人工智能 Linux 网络安全
不动编辑器写代码:OpenClaw保姆级部署(阿里云/Win11/Mac/Linux)+AI编码(口述修Bug+PR提交)+FAQ
“发现Bug→打开IDE→定位代码→调试修复→提交PR”,这是开发者的常规操作流程,一套下来至少花费半小时。但2026年,OpenClaw(昵称“小龙虾”)的AI编码能力彻底颠覆了这一模式——参考文章作者仅通过口述需求,就让OpenClaw自动拉取代码、分析Bug、编写修复代码、启动测试服务器,全程零代码操作,甚至能直接提交PR,将修Bug的时间从“半小时”压缩至“几分钟”。
2173 14
|
3月前
|
人工智能 API 网络安全
OpenClaw 零基础全解:定义 + 用途 + 完整部署教程 + 避坑指南(新手友好版)
OpenClaw是一款开源、本地优先的AI自动化代理引擎(MIT协议),以自然语言驱动,支持文件操作、浏览器自动化、多IM交互等真实任务执行。强调隐私可控、强执行、多入口接入、模型灵活适配与开源可扩展,是面向开发者与企业的自托管AI数字员工。
|
4月前
|
存储 监控 物联网
RFID办公室资产 “无纸化” 管理方案
本方案基于RFID技术,实现办公资产(电脑、打印机等)全生命周期无纸化管理:一物一码、自动识别、移动盘点、进出监控、线上报废,提升效率5–10倍,杜绝流失,满足审计合规,适用于企业、政府及科研院所等场景。(239字)
|
网络协议 5G 网络虚拟化
WiFI网速慢的原因都在这里了,3招教你WiFi慢的烦恼!
WiFI网速慢的原因都在这里了,3招教你WiFi慢的烦恼!
2719 2
|
编解码 安全 Android开发
如何修复 Android 和 Windows 不支持视频编解码器的问题?
视频播放时遇到“编解码器不支持”错误(如0xc00d36c4或0xc00d5212)是常见问题,即使文件格式为MP4或MKV。编解码器是编码和解码数据的工具,不同设备和版本支持不同的编解码器。解决方法包括:1) 安装所需编解码器,如K-Lite Codec Pack;2) 使用自带编解码器的第三方播放器,如VLC、KMPlayer等。这些方法能帮助你顺利播放视频。
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
746 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法