首页 > 其他分享 >ZZJC新生训练赛第一场题解

ZZJC新生训练赛第一场题解

时间:2024-09-27 20:22:42浏览次数:1  
标签:ZZJC 新生训练 int 题解 ll cin 异或 tie otimes

先给出比赛链接:
https://ac.nowcoder.com/acm/contest/91452

下面说一下难度分层:(同一难度下按字典序排序)
Easy(简单): B, F

Medium(中等): A, E, H

Hard(困难): C, G

Anti-AK(防AK): D, I

cin.tie(nullptr)->sync_with_stdio(false); / /加速输入输出的

A 游游的整数翻转

将所给数前k位进行翻转即可,注意要去掉前导0

我的做法是根据k切片,前一块转成int类型自动去前导0(只有数字小到能够用int表示才能这样)

Show Code A

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    string s;
    int k;
    cin >> s >> k;
    string s1 = s.substr(0, k), s2 = s.substr(k); // 切片,详见ACM notes博客
    reverse(s1.begin(), s1.end()); // 翻转字符串
    int ans1 = stoi(s1); // stoi可以把string转成int,此处用于int自动去前导零
    cout << ans1 << s2 << "\n";
}




B 困难数学题

先介绍一下异或的性质

异或及其性质

异或在C++中的运算符是 ^ (Shift + 6)

异或可以理解为按位不进位加法

1.异或的逆运算就是异或本身 如果 a $ \otimes $ b = c ,那么 c $ \otimes $ b = a

2.异或满足交换律 即 a $ \otimes $ b == b $ \otimes $ a

3.异或满足结合律 即 (a $ \otimes $ b) $ \otimes $ c == a $ \otimes $ (b $ \otimes $ c)

4.异或满足分配律 即 a $ \otimes $ (b & c) == (a $ \otimes $ b) & (a $ \otimes $ c)

对于普通加法可以用高斯定律 sn = (1 + n) * n / 2 快速计算1~n的值

对于异或运算来说也有快速计算1~n各数的异或和的方法,即:

异或前缀和

\( s(n)为1到n的数的异或和 \)

\( s(n) = \begin{cases} 1 , ~~~ n \% 4 == 1 \\ 0 , ~~~ n \% 4 == 3 \\ n , ~~~ n \% 4 == 0 \\ n + 1 , ~~~ n \% 4 == 2 \\ \end{cases} \)

代码实现如下:

auto xorprefix = [&](ll n) {
    int flag = n % 4;
    if (flag == 0) {
        return n;
    } else if (flag == 1) {
        return 1;
    } else if (flag == 2) {
        return n + 1;
    } else if (flag == 3) {
        return 0;
    }
};

根据异或的性质,我们可以知道 a xor a = 0
那么 a xor a xor a xor a = 0
所以直接输出0即可

Show Code B

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cout << 0 << "\n";
}




C

用二分找到第一个比x小的完全平方数,由于x只能+2或者-2,根据x和二分到的完全平方数的奇偶性得到与x最接近的完全平方数再求值即可

Show Code C

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    ll n;
    cin >> n;
    auto check = [&](ll x) {
        if (x * x >= n) {
            return 1;
        } else {
            return 0;
        }
    };
    ll l = 1, r = 2000000;
    while (l <= r) {
        ll mid = (l + r) >> 1;
        if (check(mid)) {
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }
    ll ans = inf, cur;
    if (r % 2 != n % 2) r--;
    cur = abs(r * r - n) / 2ll;
    ans = min(ans, cur);
    r += 2;
    cur = abs(r * r - n) / 2ll;
    ans = min(ans, cur);
    cout << ans  << "\n";
}




E

输出1到n之间所有的回文数

直接暴力遍历,对每个数判断是否是回文数即可

复杂度 $ O(nlg(n)) $

Show Code E

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++ i) {
        string cur = to_string(i);
        string recur = cur;
        reverse(recur.begin(), recur.end());
        if (cur == recur) {
            cout << cur << "\n";
        }
    }
}




F

把六个数加起来输出即可

Show Code F

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n = 6;
    int ans = 0;
    for (int i = 1; i <= n; ++ i) {
        int cur;
        cin >> cur;
        ans += cur;
    }
    cout << ans << "\n";
}




G

打表可以发现答案只可能是0.5

下证充分性:

根据古典概型

总共有 $ (n + 1) * (n + 2) $ 种情况

总共有小红正面多的情况有 $ (n + 1) * (n + 2) / 2 $ 种

除一下可知答案恒定为0.5

Show Code G

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cout << "0.500000" << "\n";
}




H

根据题目模拟即可

注意到当 a 和 k 都是偶数的时候,所有项都是偶数
当 k 是偶数的时候,所有项都和a的奇偶性相同
当 k 是奇数的时候,根据 a 和 区间的长度 len 就能知道哪种数多了

Show Code H

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    ll a, k, q;
    cin >> a >> k >> q;
    if (k & 1) {
        while (q--) {
            ll l, r;
            cin >> l >> r;
            ll len = r - l + 1ll;
            if (len & 1) {
                // 注意下面的if里面直接算由于数字太大会爆ll,所以除2取模只计算奇偶性
                if ((a % 2 + (l - 1ll) % 2 * k % 2) & 1) {
                    cout << 1 << "\n";
                } else {
                    cout << -1 << "\n";
                }
            } else {
                cout << 0 << "\n";
            }
        }
    } else {
        if (a & 1) {
            while (q--) cout << 1 << "\n";
        } else {
            while (q--) cout << -1 << "\n";
        }
    }
}




I

数论整除分块板子题(新生别看)

标签:ZZJC,新生训练,int,题解,ll,cin,异或,tie,otimes
From: https://www.cnblogs.com/Proaes/p/18436495

相关文章

  • 【洛谷】P4819 [中山市选] 杀人游戏 的题解
    【洛谷】P4819[中山市选]杀人游戏的题解题目传送门题解Tarjan我可爱的Tarjan嘻嘻qaq枚举每一个点,然后枚举每条出边,如果相连的两个点在同一个强连通分量中,或者xx......
  • 【洛谷】AT_abc178_d [ABC178D] Redistribution 的题解
    【洛谷】AT_abc178_d[ABC178D]Redistribution的题解洛谷传送门AT传送门题解一个水水的动态规划,阿巴巴巴。题目大概是这样:给定一个正整数SSS,问有多少个数满足以......
  • 【2024秋#113】锦城ACM周测题解
    2024秋#112】锦城ACM周测题解A.awa1思路这里是对答案进行二分,我们预测一个答案的范围,取这个范围的中点,试探是否可行。如果可行,将这个范围的右边的范围缩小到mid(注意我们所求是最短时间,所以当mid可行的时候我们是将预测的最大的值变小),如果不可行,说明我们预测的这个范围左边......
  • Pbootcms源码上传安装后前端显示错乱乱码问题解决方案
    PbootCMS前端显示错乱或乱码问题可能是由多种原因造成的,下面是一些可能的解决方案:检查字符集设置:确认前端页面的字符集设置是否正确。通常在HTML头部会有一个<meta>标签定义字符集,例如<metacharset="UTF-8">。同时检查PbootCMS后台的字符集设置是否与前端一致,确保数据库和......
  • 【题解】【归并排序】—— [NOIP2011 普及组] 瑞士轮
    【题解】【归并排序】——[NOIP2011普及组]瑞士轮[NOIP2011普及组]瑞士轮题目背景题目描述输入格式输出格式输入输出样例输入#1输出#1提示1.思路解析2.AC代码[NOIP2011普及组]瑞士轮通往洛谷的传送门题目背景在双人对决的竞技性比赛,如乒乓球、羽毛球、......
  • P10603 BZOJ4372 烁烁的游戏 题解
    题目传送门前置知识动态树分治|动态开点线段树|标记永久化解法考虑动态点分治。两种操作本质上是将luoguP6329【模板】点分树|震波的操作互换了下,将原需支持单点修改、区间查询的数据结构换成需支持区间修改、单点查询的数据结构即可。区间修改、单点查询的动态开......
  • Light Bulbs (Hard Version) 题解
    提供一个非常另类的解法,没有异或哈希,没有建图,没有缩点和强连通分量,而是使用了并查集和线段树的算法。由于每个颜色恰好有两种,我们考虑把两个颜色的位置\(i,j\)变成一段区间\([i,j]\)(\(i<j\)),然后每个颜色就能用一段区间\([l,r]\)表示。根据题意,如果我们激活了一个区间\([l,......
  • 【MX-J3-T3+】Tuple+ 题解
    一个比较自然的思路就是对于每个三元组\((u_i,v_i,w_i)\),把\((v_i,w_i)\)这个二元组放在属于\(u_i\)的vector里面。然后对于每一个\(i\in[1,n-3]\),把\(i\)的vector里面的所有二元组\((x,y)\)当作一条连接\(x,y\)的无向边,则我们的目的是在图中找出所有的三元环\(......
  • [ARC115E] LEQ and NEQ 题解
    我这场打的VP,结果E思考的时间比A还少。。但是我觉得我能想出这道题还是很有意义的,写篇题解记录一下。首先应该都不难想到动态规划吧?我们先使用暴力DP:设\(dp_{i,j}\)表示处理完前\(i\)个数,第\(i\)个数为\(j\)的方案数。我们考虑进行分类讨论:\(a_i≥a_{i-1}\):此时......
  • 9.27今日错题解析(软考)
    目录前言信息安全——网络攻击算法基础——二分查找数据库系统——数据库设计过程前言这是用来记录我每天备考软考设计师的错题的,今天知识点为网络攻击、二分查找和数据库设计过程,大部分错题摘自希赛中的题目,但相关解析是原创,有自己的思考,为了复习:),最后希望各位报考......