codeforces round 949 div2

news2024/10/5 19:18:52

A Turtle and Piggy Are Playing a Game

题目:

思路:输出2的幂次b使得2^b为最大的不超过x的数

代码:

#include <iostream>
 
using namespace std;
 
const int N = 2e5 + 10;
 
void solve() {
    int l, r;
    cin >> l >> r;
    if(r % 2) r --;
    int ans = 0;
    while(r != 1) {
        ans ++;
        r /= 2;
    }
    cout << ans << endl;
}
 
int main() {
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}

当然也可以直接输出_lg(x)

B. Turtle and an Infinite Sequence

问题:

思路:实际上就是求一个区间内的or值,区间为max(0, n - m), n + m。由于区间范围很大,暴力会t,因此考虑寻找某些规律。

x:100011

y:101001

从x自增到y,发现x,y最左边两位是相等的,因此这两位相等的位只有为1时才会对答案产生贡献,这两位其他位会从小的不断自增到大的,因此这些位肯定会出现1,因此答案就是从左向右拆位直到找到第一个不同的位,这之前只有1对答案有贡献,这之后都对答案有贡献

代码:

#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
const int N = 2e5 + 10;
 
int get(int x) {
    int cnt = 0;
    while(x) {
        cnt ++;
        x >>= 1;
    }
    return cnt;
}
 
int qmi(int a) {
    int res = 1;
    int b = 2;
    while(a) {
        if(a & 1) res *= b;
        b *= b;
        a >>= 1;
    }
    return res;
}
 
void solve() {
   int n, m;
   cin >> n >> m;
  
   int pos = -1;
   int x = m + n;
   int len = get(x);
   vector<int> ans;
   if(m == 0) cout << n << endl;
   else {
       vector<int> a;
       vector<int> b;
       for(int i = len - 1; i >= 0; i -- ) {
           int aa = (x >> i) & 1;
           int bb = (n >> i) & 1;
           a.push_back(aa);
           b.push_back(bb);
       }
       
       bool flag = false;
       for(int i = 0; i <= len - 1; i ++ ) {
           //cout << b[i] << " ";
           if(a[i] != b[i]) flag = true;
           if(!flag) ans.push_back(a[i]);
           else ans.push_back(1);
       }
       len = get(n);
       a.clear();
       b.clear();
       x = n;
       int y = max(0, n - m);
       for(int i = len - 1; i >= 0; i -- ) {
           int aa = (x >> i) & 1;
           int bb = (y >> i) & 1;
           a.push_back(aa);
           b.push_back(bb);
       }
       
       vector<int> ans1;
       flag = false;
       for(int i = 0; i <= len - 1; i ++ ) {
           //cout << b[i] << " ";
           if(a[i] != b[i]) flag = true;
           if(!flag) ans1.push_back(a[i]);
           else ans1.push_back(1);
       }
       reverse(ans.begin(), ans.end());
       reverse(ans1.begin(), ans1.end());
       for(int i = 0; i < ans1.size(); i ++ ) {
           ans[i] |= ans1[i];
       }
       int res = 0;
       for(int i = 0; i < ans.size(); i ++ ) {
           res += ans[i] * qmi(i);
       }
      // for(auto t: a) cout << t << " ";
       cout << res << endl;
   }
}
 
int main() {
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}

赛后优化代码:

#include <iostream>
 
using namespace std;
 
void solve() {
    int n, m;
    cin >> n >> m;
    int l = max(0, n - m), r = n + m;
    int ans = 0;
    bool flag = false;
    for(int i = 30; i >= 0; i -- ) {
        int x = (l >> i) & 1;
        int y = (r >> i) & 1;
        if(x != y) flag = true;
        if(!flag) {
            ans += (1 << i) * x;
        } else ans += (1 << i) * 1;
    }
    cout << ans << endl;
}
 
int main() {
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}

C: Turtle and an Incomplete Sequence

题目:

思路:先特判,特判掉都是-1的以及只有一个非-1数。特判之后记录所有非-1数的位置对于第一个位置和最后一个位置让他们分别向左右扫,不断除2,如果变成0就赋值-1.对于任意两位置pos[i] pos[i + 1]让他们两个向中间靠拢,哪个大就/2如果变成0就置2 最后当strat + 1 = end时判断下相邻元素是否合法。对于这种解法的正确性可以考虑一颗二叉树(父节点u 左子节点2u 右子节点2u + 1),有两个节点,两个节点不断除2最终一定会到他们的lca上.

代码:

#include <iostream>
#include <vector>

using namespace std;

const int N = 2e5 + 10;

int a[N];
int n;

void solve() {
    cin >> n;
    vector<int> pos;
    vector<int> b(n + 5);
    for(int i = 1; i <= n; i ++ ) {
        cin >> a[i];
        if(a[i] != -1) {
            pos.push_back(i);
            b[i] = a[i];
        } 
    }

    if(!pos.size()) {
        b[1] = 1;
        for(int i = 2; i <= n; i ++ ) {
            b[i] = b[i - 1] / 2;
            if(b[i] == 0) b[i] = 2;
        }
        for(int i = 1; i <= n; i ++ ) cout << b[i] << " ";
        cout << endl;
        return;
    }

    if(pos.size() == 1) {
        for(int i = pos[0]; i >= 1; i -- ) {
            b[i - 1] = b[i] / 2;
            if(b[i - 1] == 0) b[i - 1] = 2;
        }
        for(int i = pos[0]; i <= n; i ++ ) {
            b[i + 1] = b[i] / 2;
            if(b[i + 1] == 0) b[i + 1] = 2;
        }
        for(int i = 1; i <= n; i ++ ) cout << b[i] << " ";
        cout << endl;
        return; 
    }

    for(int i = 0; i < pos.size() - 1; i ++ ) {
        int start = pos[i];
        int end = pos[i + 1];
        if(i == 0) for(int j = start - 1; j >= 1; j -- ) {
            b[j] = b[j + 1] / 2;
            if(b[j] == 0) b[j] = 2;
        }
        if(i + 1 == pos.size() - 1) for(int j = end + 1; j <= n; j ++ ) {
            b[j] = b[j - 1] / 2;
            if(b[j] == 0) b[j] = 2;
        }
    
        while(start + 1 < end) {
            if(b[start] >= b[end]) {
                start ++;
                b[start] = b[start - 1] / 2;
                if(b[start] == 0) b[start] = 2;
            } else {
                end --;
                b[end] = b[end + 1] / 2;
                if(b[end] == 0) b[end] = 2;
            }
        }
        if(b[start] != b[end] / 2 && b[end] != b[start] / 2) {
            cout << "-1" << endl;
            return;
        }
    }
    for(int i = 1; i <= n; i ++ ) cout << b[i] << " ";
    cout << endl;
}

int main() {
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}

D Turtle and Multiplication

题目:

思路:优先考虑素数,于是问题转化为了在当前数量的素数中是否可以找到一条欧拉通路。点数可以用二分查找,当查找到奇数点时,由于完全连通图各点是度数为偶数,因此一定存在欧拉通路,对于偶数点,所有点度数为奇数,由于每删去一条边可以使得最多两个点度数变成偶数,因此至少要删去x / 2 - 1条边可以使得图中存在欧拉通路。因此建图后跑一遍欧拉路即可

代码:不知道什么原因1 1000000这个样例过不去,有时间再说吧

#include <iostream>
#include <cstring>
#include <vector>
 
using namespace std;
 
const int N = 1e6 + 1000;
 
vector<int> seq;
int n, cnt;
int prime[N];
int val[N * 2], ne[N * 2], h[N], idx;
bool st[N], used[N * 2];
 
void add(int a, int b) {
    val[idx] = b;
    ne[idx] = h[a];
    h[a] = idx ++;
}
 
void is_prime(int x) {
    for(int i = 2; i <= x; i ++ ) {
        if(!st[i]) prime[cnt ++] = i;
        for(int j = 0; prime[j] <= x / i; j ++ ) {
            st[prime[j] * i] = true;
            if(i % prime[j] == 0) break;
        }
    }
}
 
bool check(int x) {
    if(x & 1) {
        int cnt = x + (x * (x - 1)) / 2;
        return cnt >= n - 1;
    } else {
        int cnt = x + (x * (x - 1)) / 2 - x / 2 + 1;
        return cnt >= n - 1;
    }
}
 
void dfs(int u) {
    while(h[u] != -1) {
        int i = h[u];
        if(used[i]) {
            h[u] = ne[i];
            continue;
        }
 
        used[i] = 1;
        used[i ^ 1] = 1;
        h[u] = ne[i];
        dfs(val[i]);
        seq.push_back(val[i]);
    }
}
 
/*void dfs(int u) {
    for(int i = h[u]; i != -1; i = ne[i]) {
        if(used[i]) {
            h[u] = ne[i];
            continue;
        }
        
        used[i] = 1;
        used[i ^ 1] = 1;
        h[u] = ne[i];
        dfs(val[i]);
        seq.push_back(val[i]);
    }
}*/
 
void init() {
    for(int i = 1; i <= 2 * n + 5000; i ++ ) used[i] = 0; 
    memset(h, -1, sizeof h);
    idx = 0;
    seq.clear();
}
 
void solve() {
    init();
    cin >> n;
 
    int l = 1, r = 2000;//二分点数
    while(l < r) {
        int mid = l + r >> 1;
        if(check(mid)) r = mid;
        else l = mid + 1;
    }
    
    if(l & 1) {
        for(int i = 0; i < l; i ++ ) {
            for(int j = i; j < l; j ++ ) {
                add(prime[i], prime[j]);
                add(prime[j], prime[i]);
            }
        }
    } else {
        int judge = 0;
        int cnt = l / 2 - 1;
        for(int i = 0; i < l; i ++ ) {
            for(int j = i; j < l; j ++ ) {
                if(j == i + 1) {
                    judge ++;
                    if(!(judge & 1)) {
                        continue;
                    }
                }
                add(prime[i], prime[j]);
                add(prime[j], prime[i]);
            }
        }
    }
    
    dfs(2);
    int len = seq.size();
    for(int i = 0; i < min(len, n); i ++ ) cout << seq[i] << " ";
    if(len < n) cout << 2;
    cout << endl;
}
 
int main() {
    is_prime(200000);
    int t;
    cin >> t;
    while(t -- ) {
        solve();
    }
    return 0;
}

E:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1796534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哈希表和二维矩阵的结合-2352. 相等行列对(新思路、新解法)

题目链接及描述 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/equal-row-and-column-pairs/description/?envTypest…

制作AI问答机器人的优势和技巧

AI问答机器人已经成为我们生活和工作中的得力助手&#xff0c;应用在社会各个不同的领域中&#xff0c;它们能帮助我们快速获取信息&#xff0c;以提高做事效率&#xff0c;很多企业为了让企业的运营更加高效&#xff0c;为了从众多竞争对手中脱颖而出&#xff0c;纷纷开始制作…

VirtualBox 虚拟机中的 centos7 系统拉取 docker 镜像常见报错及解决方法

一、拉取镜像时报错&#xff1a;Error response from daemon: Get "https://registry-1.docker.io/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority 原因&#xff1a;&#xff08;文心一言给出的原因&#xff09; 这个错误…

ctfshow web

红包题第二弹 <?phpif(isset($_GET[cmd])){$cmd$_GET[cmd];highlight_file(__FILE__);if(preg_match("/[A-Za-oq-z0-9$]/",$cmd)){die("cerror");}if(preg_match("/\~|\!|\|\#|\%|\^|\&|\*|\(|\)|\&#xff08;|\&#xff09;|\-|\_|\{|\}|\…

JVM运行时数据区 - 程序计数器

运行时数据区 Java虚拟机在执行Java程序的过程中&#xff0c;会把它管理的内存划分成若干个不同的区域&#xff0c;这些区域有各自的用途、创建及销毁时间&#xff0c;有些区域随着虚拟机的启动一直存在&#xff0c;有些区域则随着用户线程的启动和结束而建立和销毁&#xff0…

c#vb代码互转工具

下载地址&#xff1a; https://download.csdn.net/download/wgxds/88979921

【MMU】——MMU 相关的 CP15 寄存器

文章目录 MMU 相关的 CP15 寄存器C1(System Control Register)C2(Translation Table Base Control Register)C3(Domain Access Control Register)C5(Data Fault Status Register)C6(Data Fault Address Register)C9C10MMU 相关的 CP15 寄存器 寄存器作用寄存器 C1 中…

信息系统项目管理师0147:工具与技术(9项目范围管理—9.3规划范围管理—9.3.2工具与技术)

点击查看专栏目录 文章目录 9.3.2 工具与技术 9.3.2 工具与技术 专家判断 规划范围管理过程中&#xff0c;应征求具备如下领域相关专业知识或接受过相关培训的个人或小组 的意见&#xff0c;涉及的领域包括&#xff1a;以往类似项目&#xff1b;特定行业、学科和应用领域的信息…

Linux操作系统:Spark在虚拟环境下的安装及部署

将Spark安装到指定目录 // 通过wget下载Spark安装包 $ wget https://d3kbcqa49mib13.cloudfront.net/spark-2.1.1-bin-hadoop2.7.tgz // 将spark解压到安装目录 $ tar –zxvf spark-2.1.1-bin-hadoop2.7.tgz –C /usr/local/ // 重命名 $ mv /usr/local/spark-2.1.1-bin-hado…

Finance Manager System (FMS)

Finance Manager System &#xff08;FMS&#xff09;财务软件&#xff0c;基本三报表合并报表

vscode 运行和调试

vscode使用断点 1.安装并激活扩展 Debugger for Chrome (弃用 --> JavaScript Debugger)Debugger for Firefox 2. 配置config文件 打开 config/index.js 并找到 devtool property。将其更新为&#xff1a; 如果你使用的是 Vue CLI 2&#xff0c;请设置并更新 config/in…

Codeforces Round 951 (Div. 2) A - C题解

这是一篇提前写的博客&#xff0c;因为时间不够&#xff0c;花了四十分钟做了A-C&#xff0c;因为题目A - C比较简单&#xff0c;所以简单说一说吧。 A. Guess the Maximum 题意&#xff1a;给你n个数字&#xff0c;选择i和j满足&#xff0c;如果其中的最大值大于k&#xff0…

Mixly 开启WIFI AP UDP收发数据

一、开发环境 软件&#xff1a;Mixly 2.0在线版 硬件&#xff1a;ESP32-C3&#xff08;立创实战派&#xff09; 固件&#xff1a;ESP32C3 Generic(UART) 测试工工具&#xff1a;NetAssist V5.0.1 二、实现功能 ESP32开启WIFI AP&#xff0c;打印接入点IP地址&#xff0c;允许…

读AI未来进行式笔记05元宇宙与XR

1. 元宇宙 1.1. 元宇宙&#xff08;Metaverse&#xff09;的概念起源于美国作家尼尔斯蒂芬森于1992年出版的科幻小说《雪崩》 1.1.1. 书中描述的是一个和现实世界平行但又紧密联系的超现实主义的三维数字虚拟空间&#xff0c;在现实世界中地理位置彼…

每日两题 / 198. 打家劫舍 74. 搜索二维矩阵(LeetCode热题100)

198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; dp[i]表示考虑前i 1号房屋&#xff0c;能获取的最大金额。对于没一间房屋都有偷与不偷两种选择 如果偷&#xff0c;需要从dp[i - 2]转移&#xff0c;因为不能偷窃相邻房屋&#xff0c;dp[i] dp[i - 2] nums[i] 如果…

封装了一个简单理解的iOS竖直文字轮播

效果图 原理 就是持有两个视图&#xff0c;并且两个视图同时改变origin.y 动画结束之后&#xff0c;判断哪个视图是在上面并且看不到的&#xff0c; 则将该视图移动到底部&#xff0c;并且该视图展示下一跳内容 在开始下一轮动画 代码 - (void)startAnimationWithDuration:(…

一文了解如何安全有效的进行PB级别的大数据迁移

在这个信息量爆炸的时代&#xff0c;处理PB级别的数据转移已成为常态&#xff0c;但对企业而言&#xff0c;这仍然是一个充满挑战的任务。今天&#xff0c;我们来探讨一下这个话题&#xff0c;看看在进行PB级数据转移时&#xff0c;需要留意哪些事项&#xff0c;可能会遇到哪些…

STM32远程更新

1 IAP 概述 1.1 工作原理 在应用中编程&#xff08; IAP &#xff09;是一种在现场通过 MCU 的通信接口&#xff08;例如 UART,USB,CAN 和以太网 等&#xff09;进行固件升级的方式。 当启动微控制器时&#xff0c;您可以选择让它进入 IAP 模式以执行 IAP 代码&am…

两个双指针 的 “他“和“ 她“会相遇么? —— “双指针“算法 (Java版)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

如何掌握 Java 正则表达式 的基本语法及在 Java 中的应用

正则表达式是一种用于匹配字符串的模式&#xff0c;在许多编程语言中广泛使用。Java 正则表达式提供了强大的文本处理能力&#xff0c;能够对字符串进行查找、替换、分割等操作。 一、正则表达式的基本语法 正则表达式由普通字符和特殊字符组成。普通字符包括字母、数字和标点…