Codeforces Round 665 (Div. 2) (A-F)

news2024/10/6 5:55:55

A.Problem - A - Codeforces

        (1)题意

                给你个X轴,初始A点在n这个位置,O在源点0,问你要把B放在哪才能让|AB-BO| = k,最小化A需要移动多少次。

        (2)思路

                直接分情况套路即可。

        (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
void solve()
{
    int n,k;
    cin >> n >> k;
    int Ans = 0;
    if((n + k) & 1) {
        Ans ++;
        n ++;
    }
    if(k > n) Ans += k - n;
    cout << Ans << '\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    cin >> T;
    while(T --) solve();
    return 0;
}

B.Problem - B - Codeforces

        (1)题意

                a序列有x1个0,y1个1,z1个2,b序列有x2个0,y2个1,z2个2,给定你这个函数,问你在任意排序后可以获得的最大价值是多少。

                

        (2)思路

                贪心考虑,肯定是先把有价值的拿了,然后把其他的都给弄成0,否则就只能加上负贡献了。       

        (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
void solve()
{
    int x1,y1,z1;
    int x2,y2,z2;
    int Ans = 0;
    cin >> x1 >> y1 >> z1;
    cin >> x2 >> y2 >> z2;
    int mi = min(z1,y2);
    y2 -= mi,z1 -= mi;
    Ans += mi * 2;
    mi = min(z1,z2);
    z1 -= mi,z2 -= mi;
    mi = min(z1,x2);
    z1 -= mi,x2 -= mi;
    mi = min(y1,y2);
    y1 -= mi,y2 -= mi;
    mi = min(y1,x2);
    y1 -= mi,x2 -= mi;
    mi = min(x1,z2);
    x1 -= mi,z2 -= mi;
    mi = min(x1,y2);
    x1 -= mi,y2 -= mi;
    mi = min(y1,y2);
    y1 -= mi,y2 -= mi;
    mi = min(x1,x2);
    x1 -= mi,x2 -= mi;
    mi = min(z1,z2);
    z1 -= mi,z2 -= mi;
    mi = min(y1,z2);
    Ans -= 2 * mi;
    cout << Ans << '\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    cin >> T;
    while(T --) solve();
    return 0;
}

C.Problem - C - Codeforces

        (1)题意

                给你一个长为n的序列,设最小值为Mi,你每次可以选择两个数a[i]和a[j],若gcd(a[i],a[j])=Mi,问你是否可以把这个序列变成不降序列。

        (2)思路

                很显然我们可以直接把%Mi为0的所有数拿出来,从大到小依次放入原序列,最后检查原序列是否不降即可。

        (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 2e5 + 10;
int a[N];
void solve()
{
    int n;
    cin >> n;
    int mi = 1e9;
    vector<int> v;
    rep(i,1,n) {
        cin >> a[i];
        mi = min(mi,a[i]);
    }
    rep(i,1,n) {
        if(a[i] % mi == 0) {
            v.pb(a[i]);
        }
    }
    sort(v.rbegin(),v.rend());
    rep(i,1,n) {
        if(a[i] % mi == 0) {
            a[i] = v.back();
            v.pop_back();
        }
    }
    rep(i,2,n) {
        if(a[i] < a[i - 1]) {
            cout << "NO" << '\n';
            return;
        }
    }
    cout << "YES" << '\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    cin >> T;
    while(T --) solve();
    return 0;
}

D.Problem - D - Codeforces

        (1)题意

                给你棵N个节点的树,和一个总权值K,要你把K分配给这颗树的N-1条边,满足这些树边相乘等于K,并且分配的边权1的数量最少,问你任意两个点的所有边权和加起来最大为多少?

        (2)思路

                我们可以计算出每条边经过多少次,因此考虑贪心分配边权即可,若K分解的质因子大于当前n - 1,则需要把后面的补成1即可,否则可以把多余的补给经过次数最多的那条边即可。

        (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 1e5 + 10;
vector<int> g[N];
ll f[N],siz[N];
int n;
const ll mod = 1e9 + 7;
inline void dfs(int u,int f)
{
    siz[u] = 1;
    for(auto v : g[u]) {
        if(v == f) continue;
        dfs(v,u);
        siz[u] += siz[v];
    }
}
void solve()
{   
    cin >> n;
    rep(i,1,n) g[i].clear();
    rep(i,2,n) {
        int u,v;
        cin >> u >> v;
        g[u].pb(v),g[v].pb(u);
    }
    int k;
    cin >> k;
    vector<ll> z;
    rep(i,1,k) cin >> f[i];
    dfs(1,0);
    rep(i,2,n) z.pb(siz[i] * (n - siz[i]));
    ll Ans = 0;
    if(sz(z) >= k) {
        sort(f + 1,f + 1 + k,[&](ll &c,ll &d){
            return c > d;
        });
        sort(z.rbegin(),z.rend());
        while(sz(z) > k) f[++ k] = 1;
        rep(i,1,sz(z)) Ans = (Ans + f[i] * z[i - 1] % mod) % mod;
    }
    else {
        sort(f + 1,f + 1 + k,[&](ll &c,ll &d){
            return c < d;
        });
        sort(z.begin(),z.end());
        ll tmp = 1,res = k - sz(z);
        for(int i = k - res + 1;i <= k;i ++) tmp = tmp * f[i] % mod;
        f[sz(z)] = f[sz(z)] * tmp % mod;
        rep(i,1,sz(z)) Ans = (Ans + f[i] * z[i - 1] % mod) % mod;
    }
    cout << Ans << '\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    cin >> T;
    while(T --) solve();
    return 0;
}

E.Problem - E - Codeforces

        (1)题意

                给你N条平行X轴的线,和M条平行Y轴的线,保证每一条线都与边框至少有一个交点,且每一条线不重合,问你最后会分出来多少个矩形。

        (2)思路

                这种题目一般是看交点就行了,因此我们观察样例很容易得出结论,答案=交点个数+1+本身交边框有两交点的线。

                那么我们可以用值域树状数组维护出来即可,用树状数组代表横坐标为多少时有一条长度为y的线,然后对于每一条平行Y轴的线做区间查找即可得出交点个数。

        (3)代码实现

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 1e6 + 10;
template <typename T>
struct Fenwick {
    const int n;
    std::vector<T> a;

    Fenwick (int n) : n(n), a(n + 1) {}

    void add(int pos, T x) {
        for (int i = pos; i <= n; i += i & -i) {
            a[i] += x;
        }
    }

    T query(int x) {
        T res = 0;
        for (int i = x; i; i -= i & -i) {
            res += a[i];
        }
        return res;
    }

    T query(int l, int r) {
        if (l == 0 || l > r) {
            return 0;
        }
        return query(r) - query(l - 1);
    }

    //找到大于k得第一个地方
    T kth(int k) {
        int pos = 0;
        for(int j = 31 - __builtin_clz(n);j >= 0;j --) {
            if(pos + (1 << j) <= n && k > a[pos + (1 << j)]) {
                pos += 1 << j;
                k -= a[pos];
            }
        }
        return pos + 1;
    }
};
//使用Fenwick<ll> fen(n)
vector<PII> a[N],b[N];
void solve()
{
    int n,m;
    cin >> n >> m;
    Fenwick<int> fen(1000001);
    ll Ans = 1;
    rep(i,1,n) {
        int y1,x1,x2;
        cin >> y1 >> x1 >> x2;
        a[x1].pb({y1 + 1,1});
        a[x2 + 1].pb({y1 + 1,-1});
        if(x1 == 0 && x2 == 1000000) Ans ++;
    }
    rep(i,1,m) {
        int x1,y1,y2;
        cin >> x1 >> y1 >> y2;
        b[x1].pb({y1 + 1,y2 + 1});
        if(y1 == 0 && y2 == 1000000) Ans ++;
    }
    rep(i,0,1000000) {
        for(auto [x,w]: a[i]) {
            fen.add(x,w);
        }
        for(auto [l,r] : b[i]) {
            Ans += fen.query(l,r);
        }
    }
    cout << Ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    // cin >> T;
    while(T --) solve();
    return 0;
}

F.Problem - F - Codeforces

        (1)题意        (2)思路

                第一个操作和第四个操作是线段树基本操作,因此不需要管,重点观察第二个操作和第三个操作,首先这颗线段树是一颗完美二叉树,包含的区间都是2^i次方,对于reverse操作来说,就是把第(k + 1)层线段树的节点的左右儿子交换,那么swap操作,其实也就是对于每一层线段树节点的左右儿子进行交换,那么这个问题就是个简单的线段树了,交换直接在外边维护好就行了。

        (3)代码

#include <bits/stdc++.h>
#define rep(i,z,n) for(int i = z;i <= n; i++)
#define per(i,n,z) for(int i = n;i >= z; i--)
#define PII pair<int,int>
#define fi first
#define se second
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(x) (int)x.size()
#define all(x) (x).begin(),(x).end()
using namespace std;
using ll = long long;
const int N = 3e5 + 10;
ll tr[N << 2];
int a[N],rev[N];
inline void build(int u,int l,int r)
{
    if(l == r) {
        tr[u] = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(u << 1,l,mid);
    build(u << 1 | 1,mid + 1,r);
    tr[u] = tr[u << 1] + tr[u << 1 | 1];
}
inline void modify(int u,int l,int r,int dep,int p,int x)
{
    if(l == r) {
        tr[u] = x;
        return;
    }
    int mid = (l + r) >> 1;
    if(p <= mid) modify(u << 1 ^ rev[dep],l,mid,dep - 1,p,x);
    else modify(u << 1 | 1 ^ rev[dep],mid + 1,r,dep - 1,p,x);
    tr[u] = tr[u << 1] + tr[u << 1 | 1];
}
inline ll query(int u,int l,int r,int dep,int ql,int qr)
{
    if(l >= ql && r <= qr) return tr[u];
    int mid = (l + r) >> 1;
    ll s = 0;
    if(ql <= mid) s += query(u << 1 ^ rev[dep],l,mid,dep - 1,ql,qr);
    if(qr > mid) s += query(u << 1 | 1 ^ rev[dep],mid + 1,r,dep - 1,ql,qr);
    return s;
}
void solve()
{
    int n,q;
    cin >> n >> q;
    rep(i,1,(1 << n)) cin >> a[i];
    build(1,1,(1 << n));
    while(q --) {
        int op,l,r;
        cin >> op;
        if(op == 1) {
            cin >> l >> r;
            modify(1,1,(1<<n),n,l,r);
        }
        else if(op == 2) {
            cin >> l;
            for(int i = 0;i <= l;i ++) rev[i] ^= 1;
        }
        else if(op == 3) {
            cin >> l;
            rev[l + 1] ^= 1;
        }
        else {
            cin >> l >> r;
            cout << query(1,1,(1<<n),n,l,r) << '\n';
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int T = 1;
    // cin >> T;
    while(T --) solve();
    return 0;
}

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

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

相关文章

uwb人员定位系统:人员轨迹实时定位

UWB定位系统是一种基于超宽带技术的定位系统。它与传统的通信技术不同&#xff0c;不需要使用载波&#xff0c;而是通过发送和接收具有纳秒或微妙级以下的极窄脉冲来实现无线传输。这种系统的优势包括低功耗、对信道衰落不敏感、抗环境能力强、不会对同一环境下的其他设备造成影…

LINUX 基本命令

​ 一 展示当前目录下的内容 $ ls查看当前目录 pwd // /home/winnie二 mkdir 三 touch-cat-more 进入翻页后 通过键盘 q 退出翻页 b 翻上一页 四 cp mv rm mv 如果 mv 2.txt 5.txt (因为5.txt不存在&#xff0c;或者说他是个文件不是路径)&#xff0c;故此操作将2.txt更名…

openfire 4.7.5 Web插件开发

文章目录 1、openfire服务端下载安装1.1、openfire解压运行1.2、Spark安装和登录 2、openfire插件开发2.1、基于servlet开发http接口2.2、基于Jersey开发http接口2.3、WEB UI页面开发2.4、上传插件2.4.1、访问servlet接口效果2.4.2、访问Jersey接口效果2.4.3、访问页面效果 Ope…

撰写博客的工具记录

文章目录 前言TyporaPicgoGitee 免费图床ScreenToGifPointofix和Snipaste墨滴社区小结 前言 本文主要目的是记录和分析自己在写博客和相关文档时所用到的工具&#xff0c;单纯记录。按照一篇文章从0到发布的场景进行叙述。 Typora Typora是一款Markdown编辑器。Markdown的优…

游戏制作资源推荐

教程 创建僵尸第一人称射击游戏 | 虚幻引擎 5 初学者教程https://www.youtube.com/watch?vqOam3QjGE8g ​​​​​​​ 虚幻商城免费资产 人物资产 各种角色应有尽有 关键词&#xff1a;paragon &#xff1b;推荐程度&#xff1a;三颗星

C. MEX Repetition

题目&#xff1a;样例&#xff1a; 输入 5 1 2 1 3 1 0 1 3 2 2 0 2 5 5 1 2 3 4 5 10 100 5 3 0 4 2 1 6 9 10 8输出 1 2 0 1 2 1 2 3 4 5 0 7 5 3 0 4 2 1 6 9 10 思路&#xff1a; 从题目和样例中&#xff0c;我们可以知道&#xff0c;从一个数组中&#xff0c;按照包括0的自…

leetCode 121. 买卖股票的最佳时机 贪心算法

给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。…

2023年汉字小达人市级比赛在线模拟题来了,四种练习助力好成绩

2023年第十届汉字小达人比赛区级自由报名活动已于9月30日结束&#xff0c;尽管最终晋级市级比赛的名单还需要在11月初发布&#xff08;有一些学校的校级选拔还没结束&#xff09;&#xff0c;但是许多小朋友已经开始准备市级比赛了。 根据往年的经验&#xff0c;实际比赛也是在…

软断言你也学不会

断言是测试用例的一部分&#xff0c;也是测试工程师开发测试用例的核心。断言通常集成在单元测试和集成测试中&#xff0c;断言分为硬断言和软断言。 硬断言是我们狭义上听到的普通断言:当用例运行后得到的[实际]结果与预期结果不匹配时&#xff0c;测试框架将停止测试执行并抛…

华为云云耀云服务器L实例评测|ClickHouse部署及压测

文章目录 前言&#x1f4e3; 1.前言概述&#x1f4e3; 2.安全设置&#x1f4e3; 3.ClickHouse安装✨ 3.1 申请服务器✨ 3.2 安装前准备✨ 3.3 RPM安装包✨ 3.4 配置文件✨ 3.5 使用ClickHouse &#x1f4e3; 4.ClickHouse压测✨ 4.1 下载数据✨ 4.2 解压数据✨ 4.3 创建数据库和…

(c++)类和对象 下篇

目录 1.再次了解构造函数 2. Static成员 3. 友元 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 1.再次了解构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { pub…

火山引擎 ByteHouse:如何提升 18000 节点的 ClickHouse 可用性?

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 ClickHouse 是业内被广泛使用的 OLAP 引擎。当集群规模过大时&#xff0c;ClickHouse 则面临使用局限性的问题。如何提升 ClickHouse 的可用性&#xff0c;成为困扰…

Python实时采集Windows CPU\MEMORY\HDD使用率

文章目录 安装psutil库在Python脚本中导入psutil库获取CPU当前使用率&#xff0c;并打印结果获取内存当前使用率&#xff0c;并打印结果获取磁盘当前使用情况&#xff0c;并打印结果推荐阅读 要通过Python实时采集Windows性能计数器的数据&#xff0c;你可以使用psutil库。psut…

怎么通过portainer部署一个vue项目

这篇文章分享一下今天通过docker打包vue项目&#xff0c;并使用打包的镜像在portainer上部署运行&#xff0c;参考了vue-cli和docker的官方文档。 首先&#xff0c;阅读vue-cli关于docker部署的说明 vue-cli关于docker部署的说明https://cli.vuejs.org/guide/deployment.html#…

SpringCloudAlibaba 相关组件的学习一

目录 前言 系统架构演变 1、单体架构 2、垂直架构 3、分布式架构 4、SOA架构 5、微服务架构 一、微服务架构的介绍 1、微服务架构的常见问题 2 微服务架构的常见概念 2.1 服务治理 2.2 服务调用 2.3 服务网关 2.4 服务容错 2.5 链路追踪 3、微服务架构的常用解决…

第2篇 机器学习基础 —(1)机器学习方式及分类、回归

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。机器学习是一种人工智能的分支&#xff0c;它使用算法和数学模型来使计算机系统能够从经验数据中学习和改进&#xff0c;而无需显式地编程。机器学习的目标是通过从数据中发现模式和规律&#xff0c;从而使计算机能够自动进…

黑马mysql教程笔记(mysql8教程)基础篇——数据库相关概念、mysql安装及卸载、数据模型、SQL通用语法及分类(DDL、DML、DQL、DCL)

参考文章1&#xff1a;https://www.bilibili.com/video/BV1Kr4y1i7ru/ 参考文章2&#xff1a;https://dhc.pythonanywhere.com/article/public/1/ 文章目录 基础篇数据库相关概念&#xff08;数据库DataBase&#xff08;DB&#xff09;、数据库管理系统DataBase Management Sy…

25种ACM模式输入输出模板,支持C++、Java、Python、Go、JS版本

很多录友苦于不熟悉 ACM 输入输入结构&#xff0c;在笔试和面试的时候&#xff0c;处理数据输入输出就花费了大量的时间&#xff0c;以至于算法题没写完&#xff0c;甚至是 根本就写不对输入输出的方式。 下面&#xff0c;我针对常见的25种 ACM输入与输出方式&#xff0c;给大…

Mojo 正式发布,Rust 能否与之匹敌?

9 月 7 日&#xff0c;Modular 公司宣布正式发布 Mojo&#xff1a;Mojo 现在已经开放本地下载——初步登陆 Linux 系统&#xff0c;并将很快提供 Mac 与 Windows 版本。据介绍&#xff0c;Mojo 最初的目标是比 Python 快 35000 倍&#xff0c;近日该团队表示&#xff0c;Mojo 将…

Linux--网络编程-字节序

进程间的通信&#xff1a; 管道、消息队列、共享内存、信号、信号量。 特点&#xff1a;都依赖于linux内核。 缺陷&#xff1a;无法多机通信。 一、网络编程&#xff1a; 1、地址&#xff1a;基于网络&#xff0c;ip地址端口号。 端口号作用&#xff1a; 一台拥有ip地址的主机…