首页 > 其他分享 >2021 ICPC 沈阳站 补题

2021 ICPC 沈阳站 补题

时间:2023-09-01 11:55:27浏览次数:33  
标签:std dist string int 补题 bit 沈阳站 col 2021

E. Edward Gaming, the Champion

签到题,扫一遍判断就行

F. Encoded Strings I

简单题,先 \(O(n^2)\) 大力预处理出来所有字符串,然后直接 sort

B. Bitwise Exclusive-OR Sequence

题意简述

一个需要填数的序列,给定多个限制,每个限制形如 \(a_u \oplus a_v = a_w\) 表示第 \(u\) 个数与第 \(v\) 个数的异或值要为 \(w\),求这个序列的和最小可以为多少

解题思路

首先可以发现这个题目形式有点像图论模型,于是可以考虑把限制看成边,建一张无向图

但是并没有什么用,还是没法确定出方案来,因为一个点改变,其他数都是会变的

所以考虑固定一个点,比如把 1 号点设为 0 去求方案,利用异或的传递性可以知道这样是有唯一方案的

如何判断合法性?图上,01(黑白),考虑按照边限制进行染色判断,一遍dfs即可,出现矛盾就-1

接下来就可以直接按位贪心了,对每一位进行图染色,优先选取颜色数少的那个加入答案

const int MAXN = 1e5 + 10;

int n, m;

struct Edge {
    int v, w;
}; std::vector<Edge> G[MAXN];

int vis1[MAXN]; bool fail;
void dfs1(int u, int res) {
    if (fail) return;
    vis1[u] = res;
    for (auto e : G[u]) {
        int v = e.v, w = e.w;
        int nr = res ^ w;
        if (vis1[v] == -1) dfs1(v, nr);
        else if (vis1[v] != -1 && vis1[v] != nr) {
            fail = true; return;
        }
        if (fail) return;
    }
}

int col[MAXN][40], color[2];
void dfs2(int u, int bit) {
    ++color[col[u][bit]];
    for (auto e : G[u]) {
        int v = e.v, w = e.w;
        if (col[v][bit] == -1) {
            if ((w >> bit) & 1 == 1) col[v][bit] = col[u][bit] ^ 1;
            else col[v][bit] = col[u][bit];
            dfs2(v, bit);
        }
    }
}

int main() {
    n = read(); m = read();
    memset(vis1, -1, sizeof vis1);
    memset(col, -1, sizeof col);
    for (int i = 1; i <= m; ++i) {
        int u = read(); int v = read(); int w = read();
        G[u].push_back({v, w});
        G[v].push_back({u, w});
    } 
    for (int i = 1; i <= n; ++i) if (vis1[i] == -1) dfs1(i, 0);
    if (fail) {
        printf("-1\n"); return 0;
    }
    long long int ans = 0;
    for (int i = 1; i <= n; ++i) {
        if (col[i][0] == -1) {
            for (int bit = 0; bit <= 30; ++bit) {
                color[0] = color[1] = 0;
                col[i][bit] = 1;
                dfs2(i, bit);
                ans += 1ll * (std::min(color[0], color[1])) * (1ll << bit);
            }
        }
    } printf("%lld\n", ans);
    return 0;
}

J. Luggage Lock

题意简述

一个四位数,每次操作可以把一段连续的位+1或-1,给定初始状态和末状态,求最少多少次操作

解题报告

也是转图论模型,每个四位数状态看成一个点,有总共20种操作(+1-1各10种)连到下一个四位数,跑一遍 bfs 即可

但是多组询问都跑 bfs 容易 T,于是考虑能不能把这玩意预处理出来

发现 1111->2222 和 0000->1111 本质是一样的,也就是对应位的数字差都相同,方案自然也就相同

所以现在就很明确了,预处理 0000 到所有其他值的操作步数,然后对于每次询问,将给定的两个状态的数字差求出来,利用上面的性质转化成 0000 到状态数字差的距离,直接输出即可

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <map>

#define DEBUG(x) std::cerr << #x << " = " << x << std::endl;
#define forall(G, i_) for (int i_ = 0, __for_siz__ = (int) G.size(); i_ < __for_siz__; ++i_)
#define ALL(x) (x).begin(), (x).end()
typedef long long int lli;
using std::cin;
using std::cout;
using std::endl;

inline int read() {
    int s = 0, x = 1; char ch = getchar();
    while (!isdigit(ch)) { if (ch == '-') x = -x; ch = getchar(); }
    while (isdigit(ch)) { s = s * 10 + ch - '0'; ch = getchar(); }
    return s * x;
}

inline int readll() {
    long long int s = 0, x = 1; char ch = getchar();
    while (!isdigit(ch)) { if (ch == '-') x = -x; ch = getchar(); }
    while (isdigit(ch)) { s = s * 10ll + ch - '0'; ch = getchar(); }
    return s * x;
}

std::map<std::string, int> dist;

const std::string ops[] = {
    "0001", "0010", "0100", "1000",
    "0011", "0110", "1100",
    "0111", "1110", "1111"
};

std::string getNext(std::string s, int id, int bt) {
    std::string res;
    for (int i = 0; i < 4; ++i) {
        res += (char) (((s[i] - '0') + (ops[id][i] - '0') * bt + 10) % 10 + '0');
    } return res;
}

void Pre() {
    std::queue<std::string> q;
    q.push("0000"); dist["0000"] = 0;
    while (!q.empty()) {
        std::string u = q.front(); q.pop();
        for (int i = 0; i < 10; ++i) {
            std::string nx = getNext(u, i, 1);
            if (!dist.count(nx)) {
                dist[nx] = dist[u] + 1;
                q.push(nx);
            }
        }
        for (int i = 0; i < 10; ++i) {
            std::string nx = getNext(u, i, -1);
            if (!dist.count(nx)) {
                dist[nx] = dist[u] + 1;
                q.push(nx);
            }
        }
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    int T; cin >> T;
    Pre();
    while (T --> 0) {
        std::string a, b; 
        cin >> a >> b;
        std::string x;
        for (int i = 0; i < 4; ++i) x += (char) (((a[i] - b[i]) + 10) % 10 + '0');
        cout << dist[x] << endl;
    }
    return 0;
}

标签:std,dist,string,int,补题,bit,沈阳站,col,2021
From: https://www.cnblogs.com/handwer/p/17671478.html

相关文章

  • The 2021 ICPC Asia Shenyang Regional Contest 解题报告
    The2021ICPCAsiaShenyangRegionalContestsolo七题罚时738打到金尾了,但是这个G和I也应该是自己能做出来的。G找了若干性质确实转化到最后一步了。但本应该搞出的dp没有想到。G和M感觉都有点降智。而I则是被复数吓到了。有点菜。B:拆位,扩展域并查集。E:签到。F......
  • idea 2021创建java web项目
    1创建普通Java项目2添加框架2.1添加框架2.2选择webapplication2.3新建如下文件夹在WEB-INF目录下,新建classes和lib文件夹,分别用于之后存字节码文件和jar包3编辑项目结构设置相关文件保存路径3.1设置编译文件保存路径3.2设置jar包保存路径12344t......
  • CSP-J2021初赛易错题解析
    12.由 1,1,2,2,3 这五个数字组成不同的三位数有()种。A.18 B.15 C.12 D.24正解:枚举法,枚举即可,共18种 15.有四个人要从A点坐一条船过河到B点,船一开始在A点。该船一次最多可坐两个人。已知这四个人中每个人独自坐船的过河时间分别为 1,2,4,8,且两个人坐船的......
  • pyinstaller打包openvino 2021.4.2
    打包准备1.安装pyinstallercondacreate-n opinstallpython=3.7-ycondaactivate opinstallpip installopenvinopipinstallpyinstaller2.将openvino文件夹复制到代码同级目录下D:\ProgramData\anaconda3\envs\openvino_install\Lib\site-packages\openvino拷贝至......
  • AE2021下载 AE最新版下载+安装包+安装教程 中文版直装
    AfterEffects是视频编辑工作室的领先创作软件,经常用于电影、电视和网络等行业。它可以创建电影视频标题、标题和过渡,从剪辑中删除对象,并支持动画效果。AfterEffects是一款行业标准的动态图形和视觉效果软件,可帮助用户将任何灵感转化为动画。软件地址:看置顶贴AE主要功能图形视......
  • Dreamweaver2021设计DW2021下载安装 中文版直装
    Dreamweaver2021版是一款非常专业的网页设计工具,设计功能强大,集网页制作和网站管理于一体,强大的编辑器让您的工作更轻松!功能介绍:可视化界面:Dreamweaver提供了可视化界面,使得用户可以直接在界面上操作,无需编写代码。代码编辑器:Dreamweaver也提供了代码编辑器,方便用户编辑和调试代码......
  • Namomo Summer Camp 23 Day 1(GCPC2021)
    NamomoSummerCamp23Day1(GCPC2021)ProblemB:BrexitingandBrentering签到#include<bits/stdc++.h>usingi64=longlong;usingnamespacestd;typedefpair<i64,i64>PII;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr)......
  • [SWPUCTF 2021 新生赛]finalrce
    [SWPUCTF2021新生赛]finalrce题目来源:nssctf题目类型:web涉及考点:RCE1.上来先做代码审计<?phphighlight_file(__FILE__);if(isset($_GET['url'])){$url=$_GET['url'];if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|ph......
  • namomo camp day1(2021GCPC) BAIDHG
    namomocampday1目录namomocampday1B-BrexitingandBrenteringA-AmusementArcadeI-Monty'sHallD-ExcursiontoPorvooH-LookingforWaldoG-Killjoys'ConferenceB-BrexitingandBrentering字符串替换voidsolve(){strings;cin&......
  • 2021/08/23
    <WS2tcpip.h>和<winsock2.h>是用于Windows套接字编程的两个不同的头文件,它们提供了不同层次的网络编程功能。下面是它们的主要区别:<winsock2.h>:包含了最基本的Winsock函数和结构,用于套接字编程。提供了底层的套接字操作,例如socket()、bind()、listen()、accept()、c......