牛客练习赛130(A,B,C)(二进制,思维,前缀和,线段树)

news2024/10/19 14:32:10

比赛链接

牛客练习赛130

A题

思路

如果 x x x y y y相等,一步都不需要。

x x x y y y进行二进制拆位,如果同时出现 x x x的二进制位等于 1 1 1并且 y y y的二进制位等于 0 0 0 x x x的二进制位等于 0 0 0并且 y y y的二进制位等于 1 1 1,则至少需要2步。

否则,1步即可。

代码
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int N = 2e5 + 5, M = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;

int x, y;
void solve()
{
    cin >> x >> y;
    if (x == y)
    {
        cout << 0 << endl;
        return;
    }
    int cnt1 = 0, cnt2 = 0;
    for (int i = 60; i >= 0; i--)
    {
        int bit = (x >> i) & 1;
        int op = (y >> i) & 1;
        if (bit == 1 && op == 0)
        {
            cnt1++;
        }
        if (bit == 0 && op == 1)
        {
            cnt2++;
        }
    }
    if (cnt1 && cnt2)
    {
        cout << 2 << endl;
        return;
    }
    cout << 1 << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int test = 1;
    cin >> test;
    for (int i = 1; i <= test; i++)
    {
        solve();
    }
    return 0;
}

B题

思路

h + R ∗ ( k − 1 ) < = 0 h + R * (k - 1) <= 0 h+R(k1)<=0 h + k ∗ L > 0 h + k * L > 0 h+kL>0时,必然无解,否则一定有解。

我们可以先令前 k − 1 k-1 k1个为 R R R,第 k k k个为 L L L。令 s u m = h + R ∗ ( k − 1 ) + L sum = h + R * (k - 1) + L sum=h+R(k1)+L,如果 s u m > 0 sum > 0 sum>0,则说明骑士的血多了。

我们可以倒着进行调整,如果当前的 a n s [ i ] ans[i] ans[i]可以继续调整,则用 a n s [ i ] 减去 ans[i]减去 ans[i]减去 m i n ( s u m , R − L ) min(sum,R-L) min(sum,RL)

代码
#pragma GCC optimize("O2")
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int N = 2e5 + 5, M = 1e6 + 5;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f3f3f3f3f;

int n, k, h, L, R;
void solve()
{
    cin >> n >> k >> h >> L >> R;
    if (h + R * (k - 1) <= 0 || h + k * L > 0)
    {
        cout << "impossible" << endl;
        return;
    }
    vector<int> ans(n + 1, 0);
    for (int i = 1; i < k; i++)
        ans[i] = R;
    ans[k] = L;
    int sum = h + R * (k - 1) + L;
    for (int i = k - 1; i >= 1; i--)
    {
        if (sum <= 0)
            break;
        int op = min(sum, R - L);
        ans[i] -= op;
        sum -= op;
    }
    for (int i = k + 1; i <= n; i++)
        ans[i] = L;
    for (int i = 1; i <= n; i++)
    {
        cout << ans[i] << " ";
    }
    cout << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int test = 1;
    // cin >> test;
    for (int i = 1; i <= test; i++)
    {
        solve();
    }
    return 0;
}

C题

思路

i ≤ j i \le j ij时, V = ∑ i = 1 n ∑ j = 1 n f i × g j V = \sum_{i=1}^{n} \sum_{j=1}^{n}f_{i} \times g_{j} V=i=1nj=1nfi×gj

i ≥ j i \ge j ij时, V = ∑ i = 1 n ∑ j = 1 n f j × g i V = \sum_{i=1}^{n} \sum_{j=1}^{n}f_{j} \times g_{i} V=i=1nj=1nfj×gi

因此, V = ∑ i = 1 n ∑ j = i n f i × g j + ∑ i = 1 n ∑ j = 1 i f j × g i − ∑ i = 1 n f i × g i V = \sum_{i=1}^{n} \sum_{j=i}^{n}f_{i} \times g_{j} + \sum_{i=1}^{n} \sum_{j=1}^{i}f_{j} \times g_{i} - \sum_{i=1}^{n}f_{i}\times g_{i} V=i=1nj=infi×gj+i=1nj=1ifj×gii=1nfi×gi

化简得: V = ∑ i = 1 n f i × ( ∑ j = i n g j ) + ∑ i = 1 n g i × ( ∑ j = 1 i f j ) − ∑ i = 1 n f i × g i V = \sum_{i=1}^{n}f_{i} \times (\sum_{j=i}^{n}g_{j}) + \sum_{i=1}^{n}g_{i} \times (\sum_{j=1}^{i}f_{j}) - \sum_{i=1}^{n}f_{i}\times g_{i} V=i=1nfi×(j=ingj)+i=1ngi×(j=1ifj)i=1nfi×gi

p r e [ ] pre[] pre[] f [ ] f[] f[]的前缀和数组, n x t [ ] nxt[] nxt[] g [ ] g[] g[]的后缀和数组。

V = ∑ i = 1 n f i × n x t [ i ] + ∑ i = 1 n g i × p r e [ i ] − ∑ i = 1 n f i × g i V = \sum_{i=1}^{n}f_{i} \times nxt[i] + \sum_{i=1}^{n}g_{i} \times pre[i] - \sum_{i=1}^{n}f_{i}\times g_{i} V=i=1nfi×nxt[i]+i=1ngi×pre[i]i=1nfi×gi

因此,我们可以用两棵线段树分别维护 p r e [ ] pre[] pre[] n x t [ ] nxt[] nxt[]的区间和,每以此询问即是一次单点修改和区间查询。

代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5, M = 1e6 + 5;
const int mod = 998244353;
const int inf = 0x3f3f3f3f3f3f3f3f;
int n, q;
int f[N], g[N], pre[N], nxt[N];
struct segmenttree
{
    struct node
    {
        int l, r, sum, tag;
    };
    vector<node> tree;

    segmenttree() : tree(1) {}
    segmenttree(int n) : tree(n * 4 + 1) {}

    void pushup(int u)
    {
        auto &root = tree[u], &left = tree[u << 1], &right = tree[u << 1 | 1];
        root.sum = (left.sum + right.sum) % mod;
    }

    void pushdown(int u)
    {
        auto &root = tree[u], &left = tree[u << 1], &right = tree[u << 1 | 1];
        if (root.tag != 0)
        {
            left.tag += root.tag;
            left.tag %= mod;
            right.tag += root.tag;
            right.tag %= mod;
            left.sum += ((left.r - left.l + 1) * root.tag % mod);
            left.sum %= mod;
            right.sum += ((right.r - right.l + 1) * root.tag % mod);
            right.sum %= mod;
            root.tag = 0;
        }
    }

    void build(int u, int l, int r, int w[])
    {
        auto &root = tree[u];
        root = {l, r};
        if (l == r)
        {
            root.sum = w[r] % mod;
        }
        else
        {
            int mid = l + r >> 1;
            build(u << 1, l, mid, w);
            build(u << 1 | 1, mid + 1, r, w);
            pushup(u);
        }
    }

    void modify(int u, int l, int r, int val)
    {
        auto &root = tree[u];
        if (root.l >= l && root.r <= r)
        {
            root.sum += ((tree[u].r - tree[u].l + 1) * val % mod);
            root.sum %= mod;
            root.tag += val;
            root.tag %= mod;
            return;
        }
        pushdown(u);
        int mid = root.l + root.r >> 1;
        if (l <= mid)
            modify(u << 1, l, r, val);
        if (r > mid)
            modify(u << 1 | 1, l, r, val);
        pushup(u);
    }

    int query(int u, int l, int r)
    {
        auto &root = tree[u];
        if (root.l >= l && root.r <= r)
        {
            return root.sum % mod;
        }
        pushdown(u);
        int mid = root.l + root.r >> 1;
        int res = 0;
        if (l <= mid)
            res += query(u << 1, l, r), res %= mod;
        if (r > mid)
            res += query(u << 1 | 1, l, r), res %= mod;
        return res;
    }
};
int MOD(int x)
{
    return (x % mod + mod) % mod;
}
void solve()
{
    cin >> n >> q;
    for (int i = 1; i <= n; i++)
    {
        cin >> f[i];
    }
    for (int i = 1; i <= n; i++)
    {
        cin >> g[i];
    }
    for (int i = 1, j = n; i <= n; i++, j--)
    {
        pre[i] = (pre[i - 1] + f[i]) % mod;
        nxt[j] = (nxt[j + 1] + g[j]) % mod;
    }
    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        ans = (ans + (f[i] * nxt[i]) % mod) % mod;
        ans = (ans + (g[i] * pre[i]) % mod) % mod;
        ans = (ans - f[i] * g[i] % mod) % mod;
    }
    ans = MOD(ans);
    segmenttree smt1(n);
    segmenttree smt2(n);
    smt1.build(1, 1, n, pre);
    smt2.build(1, 1, n, nxt);
    while (q--)
    {
        int t, i, x;
        cin >> t >> i >> x;
        if (t == 1)
        {
            smt1.modify(1, i, n, -f[i]);
            ans = (ans - f[i] * smt2.query(1, i, i) % mod) % mod;
            int res = 0;
            res = smt2.query(1, i, i);
            ans = (ans - res * (f[i] % mod) % mod) % mod;
            ans = (ans + f[i] * g[i] % mod) % mod;
            f[i] = x;
            smt1.modify(1, i, n, f[i]);
            ans = (ans + f[i] * smt2.query(1, i, i) % mod) % mod;
            ans = (ans + res * (f[i] % mod) % mod) % mod;
            ans = (ans - f[i] * g[i] % mod) % mod;
        }
        else
        {
            smt2.modify(1, 1, i, -g[i]);
            ans = (ans - g[i] * smt1.query(1, i, i) % mod) % mod;
            int res = 0;

            res = smt1.query(1, i, i);
            ans = (ans - res * g[i] % mod) % mod;
            ans = (ans + f[i] * g[i] % mod) % mod;
            g[i] = x;
            smt2.modify(1, 1, i, g[i]);
            ans = (ans + g[i] * smt1.query(1, i, i) % mod) % mod;
            ans = (ans + res * g[i] % mod) % mod;
            ans = (ans - f[i] * g[i] % mod) % mod;
        }
        ans = MOD(ans);
        cout << ans << endl;
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int test = 1;
    // cin >> test;
    for (int i = 1; i <= test; i++)
    {
        solve();
    }
    return 0;
}

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

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

相关文章

84.【C语言】数据结构之顺序表的头部插入和删除

目录 3.操作顺序表 1.分析头部插入函数 SeqList.c写入 容量检查函数 注意 main.c改为 SeqList.h添加SLPushFront的声明 运行结果 2.分析头部删除函数 SLPopFront代码 main.c改为 SeqList.h添加SLPopFront的声明 图分析 运行结果 承接83.【C语言】数据结构之顺序表…

文心一言 VS 讯飞星火 VS chatgpt (372)-- 算法导论24.4 4题

四、请将单源单目的地最短路径问题表示为一个线性规划问题。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 单源单目的地最短路径问题可以通过线性规划&#xff08;Linear Programming, LP&#xff09;进行建模。假设我们有一个加权有向图 $ G (V, E) $&#…

【LeetCode】每日一题 2024_10_14 鸡蛋掉落(记忆化搜索)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;鸡蛋掉落 代码与解题思路 今天的题目是昨天的进阶版&#xff0c;昨天给了 2 个鸡蛋&#xff0c;让我们求在一栋有 n 层楼的建筑中扔鸡蛋的最大操作次数 但是今天的题目给了 k 个鸡蛋&am…

linux 离线安装redis

1.官网下载 https://redis.io/download 或者去github下载 2.安装 Redis 解压 unzip redis-6.2.16.zip安装gcc #由于 redis 是用 C 语言开发&#xff0c;安装之前必先确认是否安装 gcc 环境&#xff08;gcc -v&#xff09; gcc -v若无安装gcc&#xff0c;参考我的文章 Lin…

kaggle中如何更新上传自定义的数据集dataset?

前言: kaggle notebook中可以上传自己的数据集进行训练&#xff0c;但是如果我们发现这个数据集有一部分需要更新下呢&#xff0c;这时候我们不必新建一个数据集&#xff0c;直接在原来的版本上进行更新即可。 以datasett的更新为例&#xff0c;在这个界面是看不到更新按钮的 …

Axure使用echarts详细教程

本次使用的axure版本为rp9,下面是效果图。 接下来是详细步骤 【步骤1】在axure上拖一个矩形进来&#xff0c;命名为myChart(这个根据实际情况来,和后面的代码对应就好) 【步骤2】 点击交互->选择加载时->选择打开链接->链接外部地址 点击fx这个符号 【步骤3】在弹…

【建筑行业】在线培训知识库与人才培养

在快速变化的建筑行业中&#xff0c;人才培养一直是企业持续发展和创新的关键。随着数字化时代的到来&#xff0c;建筑行业面临着前所未有的挑战和机遇。在线培训知识库作为一种新兴的教育工具&#xff0c;正在成为建筑行业人才培养的重要支撑。本文将深入探讨建筑行业在线培训…

Bolt 一款AI 全栈 Web 在线开发工具

参考&#xff1a; https://bolt.new/ github项目也可以支持Bolt在线打开编辑 直接连接前输入&#xff0c;比如 https://github.com/lyz1810/live2dSpeek更换成 https://bolt.new/github.com/lyz1810/live2dSpeek https://bolt.new/github.com/oh-my-live2d/oh-my-live2d 主要偏…

《OpenCV计算机视觉》——人脸检测__Haar特征、级联分类器

文章目录 Haar特征一、定义与原理二、分类三、计算方法四、应用五、优缺点 级联分类器一、定义与原理二、结构与组成三、举例说明 Haar特征 Haar特征是一种在计算机视觉和图像处理中常用的特征描述方法&#xff0c;特别适用于物体识别&#xff0c;尤其是人脸检测。以下是对Haa…

自制编程语言(一、基本的编译器)

此教程实现一个simple语言 这是一个编译型语言&#xff0c;编译成nasm simple.h #include <iostream> #include <fstream> #include <sstream> #include <string> #include <unordered_set> #include <set>void clearFileContent(const…

如在下载自己的需要的rmp包呢

下载地址&#xff1a;https://pkgs.org/和https://rpmfind.net/linux/rpm2html/search.php 根基自己的需要进行下载使用。

IRMV Lab新作:Mamba Diffusion模型实现高精度2D手部轨迹预测

作者主页&#xff1a; https://bit-mjy.github.io/ https://xieyuanli-chen.com/ 论文标题&#xff1a; MADiff: Motion-Aware Mamba Diffusion Models for Hand Trajectory Prediction on Egocentric Videos 1. 背景与挑战 在具身人工智能&#xff08;Embodied AI&#xff0…

NAT机制

目录 1、NAT机制的定义 2、NAT机制的工作原理 1、NAT机制的定义 如今IP地址的分配已经不够使用&#xff0c;为了解决这一问题&#xff0c;NAT机制起到了很关键的作用。 NAT机制&#xff08;网络地址转换&#xff09;&#xff0c;本质上&#xff0c;让一个IP地址代表一批设备…

【SpringBoot】14 缓存(cache)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 Spring 框架支持透明地向应用程序添加缓存对缓存进行管理&#xff0c;其管理缓存的核心是将缓存应用于操作数据的方法&#xff08;包括增删查改等&#xff09;&#xff0c;从而减少操作数据的执行次数&#xff08;主要是查询…

录微课专用提词器,不会被录进视频中的提词器,还能显示PPT中备注的内容

不坑提词器&#xff0c;全称&#xff1a;不坑隐形提词器。是一款能够在截图、录屏、直播过程中隐藏界面的提词器软件。 系统要求&#xff1a;Win10 1024 以上&#xff08;特别提醒&#xff1a;Win7状态下不可隐身&#xff09; ⏬下载 提词器默认放在不坑盒子的安装目录下&…

基于springboot家乡特色推荐系统

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

【YOLOv11】制作使用YOLOv11的docker环境

目录 一 安装docker 1 安装依赖 2 添加docker官网 GPG 密钥、设置stable 仓库 3 安装 4 使用 二 环境制作 ① 拉基础镜像 ② 起容器 ③ 安装Anaconda3 ④ 安装YOLO11 ⑤ /root/.bashrc ⑥ 退出容器 ⑦ 保存镜像 ⑧ 镜像的使用 一 安装docker ubuntu:20.04 1 安装…

与双指针的亲密接触:快与慢的浪漫交错

公主请阅 1.合并两个有序数组1.1 题目说明示例 1示例 2示例 3 1.2 题目分析 1.3代码部分1.4 代码解析 2.移动零2.1题目说明示例 1示例 2 2.2题目分析2.3代码部分2.4代码解析 1.合并两个有序数组 题目传送门 1.1 题目说明 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums…

25计软新增考研院校!或可捡漏上岸!

C哥专业提供——计软考研院校选择分析专业课备考指南规划 新增的计算机与软件工程考研院校为考研同学带来了多方面的机遇&#xff0c;这些机遇不仅体现在过国家线后可能面临的更低竞争压力&#xff0c;还包括更多元化的教育选择和更广阔的就业前景&#xff1a; 一、降低竞争压…

周报5<仅供自己学习>

文章目录 一、NeRF代码1.齐次化位姿坐标2.理解rays_d和rays_o3.min_line_dist的函数问题1&#xff1a;该函数的作用问题2&#xff1a;为何要计算ray_d的外积①形成投影矩阵&#xff08;1&#xff09;投影矩阵&#xff08;2&#xff09;投影矩阵的性质&#xff08;3&#xff09;…