Codeforces Round 881 (Div. 3)(A~F1题解)

news2024/11/29 3:58:37

这场比赛可能是因为比较老吧,我感觉很轻松,就是第五个卡了一下,看错题了,原本应该是严格大于的,从而导致代码一直出现bug,在1小时20分钟才解决

A. Sasha and Array Coloring

题意:就是说给你n个组数,然后你可以给每个数一个颜色,让我们判断每个颜色种类内的最大值和最小值的差值的累加和最大是多少

思路:先排序,将数组分成两部分然后用最大值减去最小值,算累加和就可以求出来

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
int a[200005];

void solve()
{
	cin>>n;
	int len=n/2;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	sort(a+1,a+1+n);
	int ans=0;
	for(int i=n;i>n-len;i--)
	ans+=a[i];
	for(int i=1;i<=len;i++)
	ans-=a[i];
	cout<<ans<<"\n";;
}

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

B. Long Long

题意:就是说给你一个数组,然后你可以每次选择翻转一个区间,区间内的值变成相反数,然后问你最少翻转几次,才能让整个数组的最大累加和

思路:想要得到最大值肯定就是将所有负数翻转成正数,所以我们的数组最大值就是所有元素的绝对值之和,那么我们考虑最少翻转问题?

什么时候才需要翻转呢?当我们碰到负数才需要翻转。什么时候停止翻转?当碰到正数的时候就要停止翻转,我们用flag去记录状态,flag=0,表示没有在翻转状态,当flag=1,表示当前在翻转状态

当我们flag=0时,碰到负数,翻转次数就要+1,同时将flag变成1。当我们flag=1时,当我们碰到正数就要停止翻转状态,同时将flag变成0

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
int a[200005];

void solve()
{
	cin>>n;
	int ans=0,cnt=0;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		ans+=abs(a[i]);
	}
	int flag=0;
	for(int i=1;i<=n;i++)
	{
		if(a[i]<0&&flag==0)
		{
			flag=1;
			cnt++;
		}
		else if(flag==1&&a[i]>0)
		{
			flag=0;
		}
	}
	cout<<ans<<" "<<cnt<<"\n";
}

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

C. Sum in Binary Tree

 

题意:就是说给你一个数n,让你判断,从1到n这个路径上的所有数的累加和是多少

 思路:感觉比第二个还水,三分钟写完,就用到了一个二叉树的性质,假设根节点是1的话,那么对于i节点来说,其左子节点是2*i,右子节点是2*i+1,

于是我们就可以反推,假设我们当前n节点是奇数,那么(n-1)/2就是其父节点,如果n节点是偶数的话,那么n/2就是其父节点,然后累加起来就行

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,k;
int a[200005];

void solve()
{
	cin>>n;
	int sum=0;
	while(n)
	{
		sum+=n;
		if(n%2==1)
		n=(n-1)/2;
		else
		n/=2;
	}
	cout<<sum<<"\n";
}

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

D. Apple Tree

题意:就是说树上有两个苹果,而且是可以在树上的任意节点,其下落过程只能下落在其子节点上,问你这两个苹果下落的组合有多少种情况

思路:其实读懂题之后你就会发现,最终的结果数就是两个苹果最低端的叶子结点总数的乘积

我们用dp[i]表示,第i个节点有dp[i]个叶子节点,我们深搜跑一遍,碰到叶子结点就是dp[n]=1;

碰到子节点就是dp[v]+=dp[u](v是当前结点,u是v的子节点)

#include <bits/stdc++.h>
using namespace std;
#define int long long

int t;
int n, q;
int dp[200005];  
vector<int> e[200005]; 


void dfs(int v, int fa) 
{
    dp[v] = 0; 
    bool isLeaf = true; 
    for (int u : e[v]) 
	{
        if (u != fa) 
		{
            isLeaf = false;
            dfs(u, v); 
            dp[v] += dp[u]; 
        }
    }
    if (isLeaf) 
	{
        dp[v] = 1;
    }
}

void solve() 
{
    cin >> n;
    for (int i = 1; i <= n; ++i) 
	{
        e[i].clear(); 
        dp[i] = 0;    
    }

    int u, v;
    for (int i = 1; i <= n - 1; ++i) 
	{
        cin >> u >> v;
        e[u].push_back(v);
        e[v].push_back(u);
    }

    dfs(1, 0);

    cin >> q;
    for (int i = 1; i <= q; ++i) 
	{
        cin >> u >> v;
        cout << dp[u] * dp[v] << "\n"; 
    }
}

signed main() 
{
    ios_base::sync_with_stdio(false);  
    cin.tie(0);  
    cout.tie(0);  
    cin >> t; 
    while (t--) 
	{
        solve(); 
    }
    return 0;
}

E. Tracking Segments

题意:就是说给你一个长度为n的数组,数组里面的每个数都是0,然后给你m个询问序列,每次给你一个L和R,问你这段区间内的1的数量能否严格大于0的数量,然后给你q个操作,每次可以将x位置的0变成1,然后问你最少操作几次,就可以让上述m个区间里面,有一个能够让其1的数量能否严格大于0的数量

思路:一眼前缀和+二分,但是我没有注意到严格大于,被卡了40分钟,现在想来纯纯裂开

我们的二分的答案,肯定是在1~q之间,那么我们跑一遍二分,然后去判断,mid前的操作能否让上述m个区间里面,至少有一个满足条件,如果满足就缩小mid,如果不满足,就扩大mid

#include <bits/stdc++.h>
using namespace std;
#define int long long

int t;
int n, m;
int l[100005], r[100005];
int q;
int x[100005];
int pre[100005];

bool check(int mid) {
    memset(pre, 0, sizeof(pre));
    for (int i = 1; i <= mid; i++) {
        pre[x[i]] = 1;
    }
    for (int i = 1; i <= n; i++) {
        pre[i] += pre[i - 1];
    }
    for (int i = 1; i <= m; i++) {
        int qu = r[i] - l[i] + 1;
        int num = qu/2+1; // 修正计算方式
        if (pre[r[i]] - pre[l[i] - 1] >= num)
            return true;
    }
    return false;
}

void solve() {
    cin >> n >> m;
    for (int i = 1; i <= m; i++) {
        cin >> l[i] >> r[i];
    }
    cin >> q;
    for (int i = 1; i <= q; i++) {
        cin >> x[i];
    }
    
    int L = 1, R = q;
    while (L < R) {
        int mid = (L + R) / 2;
        if (check(mid)) {
            R = mid;
        } else {
            L = mid + 1;
        }
    }
    
    if(check(L))
    cout << L << "\n";
    else
    cout<<-1<<"\n";
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin >> t;
    while (t--)
        solve();
    return 0;
}

F1. Omsk Metro (simple version)

题意:就是说给你一棵树,每个节点的值为1或者-1,然后问你有没有一条路径上的值为k

思路:树上dp跑一遍,求最大值和最小值,处在这个区间那就是满足,输出yes,否则就是no

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
char flag;
int u,v,x;
void solve()
{
	cin>>n;
    vector<int>dmax(n+10),dmin(n+10),dx(n+10),dn(n+10);
	dmax[1]=1;
	dmin[1]=0;
	dx[1]=1;
	dn[1]=0;
	int cnt=2;//去统计该第几个点了 
	for(int i=1;i<=n;i++)
	{
		cin>>flag;
		if(flag=='+')
		{
			cin>>v>>x;
			dmax[cnt]=max(x,dmax[v]+x);
			dx[cnt]=max(dx[v],dmax[cnt]);
			dmin[cnt]=min(x,dmin[v]+x);
			dn[cnt]=min(dn[v],dmin[cnt]);
			cnt++;
		}
		else
		{
			cin>>u>>v>>x;
			if(x>=dn[v]&&dx[v]>=x)
			cout<<"YES\n";
			else
			cout<<"NO\n";
		}
	}
}

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

不要问我F2为什么不写,因为我不会树剖,我是贵物

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

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

相关文章

提权 | Windows系统

文章目录 cmd提权meterpreter提权getsystemsteal_tokenmigrate 令牌窃取(MS16-075)烂土豆提权步骤烂土豆提权原理 sc命令提权抓本地密码提权其他工具pr工具 内核提权WindowsVulScan cmd提权 前言&#xff1a;我们getshell一个用windows部署的网站后&#xff0c;通过蚁剑或者其…

ESP32 S3 语音识别 语音唤醒程序流程

ESP32 S3 语音识别 语音唤醒程序流程 参考例程首先进行esp_periph_set_init 初始化之后执行setup_player&#xff0c;之后执行start_recorder&#xff0c;识别的主处理voice_read_task 参考例程 D:\Espressif\esp-adf\examples\speech_recognition\wwe\ 首先进行esp_periph_se…

零知识学习WLAN漫游二、无线漫游介绍(2)

接前一篇文章&#xff1a;零知识学习WLAN漫游一、无线漫游介绍&#xff08;1&#xff09; 本文内容参考&#xff1a; WLAN漫游简介_漫游主动性-CSDN博客 无线漫游_百度百科 无线漫游简述-CSDN博客 特此致谢&#xff01; 一、WLAN漫游简介 3. 漫游协议和快速漫游协议 802.…

算法的学习笔记—数字在排序数组中出现的次数(牛客JZ53)

&#x1f600;前言 在编程中&#xff0c;查找有序数组中特定元素的出现次数是一个常见的问题。本文将详细讲解这个问题的解决方案&#xff0c;并通过二分查找法优化效率。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1f970;数字在排序数组中出现的次数&#x…

九、pico+Unity交互开发——触碰抓取

一、VR交互的类型 Hover&#xff08;悬停&#xff09; 定义&#xff1a;发起交互的对象停留在可交互对象的交互区域。例如&#xff0c;当手触摸到物品表面&#xff08;可交互区域&#xff09;时&#xff0c;视为触发了Hover。 Grab&#xff08;抓取&#xff09; 概念&#xff…

深入浅出:深度学习模型部署全流程详解

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a; 【论文精读】PSAD&#xff1a;小样本部件分割揭示工业异常检测的合成逻辑每日一言&#x1f33c;: 生活要有所期待&#xff0c; 否则就如同罩在…

【国潮来袭】华为原生鸿蒙 HarmonyOS NEXT(5.0)正式发布:鸿蒙诞生以来最大升级,碰一碰、小艺圈选重磅上线

在昨日晚间的原生鸿蒙之夜暨华为全场景新品发布会上&#xff0c;华为原生鸿蒙 HarmonyOS NEXT&#xff08;5.0&#xff09;正式发布。 华为官方透露&#xff0c;截至目前&#xff0c;鸿蒙操作系统在中国市场份额占据 Top2 的领先地位&#xff0c;拥有超过 1.1 亿 的代码行和 6…

想让前后端交互更轻松?alovajs了解一下?

作为一个前端开发者&#xff0c;我最近发现了一个超赞的请求库 alovajs&#xff0c;它真的让我眼前一亮&#xff01;说实话&#xff0c;我感觉自己找到了前端开发的新大陆。大家知道&#xff0c;在前端开发中&#xff0c;处理 Client-Server 交互一直是个老大难的问题&#xff…

查缺补漏----用户工作区,系统缓冲区,外设工作最短时间计算

对于下面这一题&#xff0c;分析起来很简单&#xff1a; 答案&#xff1a;C 以上是单缓冲区&#xff0c;补充双缓冲区是什么情况&#xff1a; 1.假设磁盘块与缓冲区大小相同&#xff0c;每个盘块读入缓冲区的时间为15us&#xff0c;由缓冲区送至用户区的时间是5us&#xff0c…

etl-查询错误log日志和oracle删除数据表空间

查看weblogic日志的目录 建立连接ssh root192.168.30.1xx 密码hygd123 找到下面路径中的文件 cd /home/weblogic/Oracle/Middleware/user_projects/domains/base_domain/bapp-logs 查看log日志 tail -f -n 400 Adminservers.log oracle删除表空间&#xff08;切换到dba用户…

Android 13 SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口

frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java createTileInternal(tileSpec)方法注释想隐藏的模块即可。

Qt开发-----线程调度

目录 前言 一、Linux下查看进程的情况 二、线程的创建 三、多线程的创建和使用 前言 以下引用内容源自正点原子Qt开发指南文档。 我们写的一个应用程序&#xff0c;应用程序跑起来后一般情况下只有一个线程&#xff0c;但是可能也有特殊情况。比如我们前面章节写的例程都跑…

《YOLO目标检测》—— YOLOv1 详细介绍

文章目录 一、算法特点二、网络结构三、检测过程四、损失函数五、性能表现六、优缺点 YOLO v1&#xff08;You Only Look Once version 1&#xff09;是一种快速的目标检测算法&#xff0c;以下是对YOLO v1的详细介绍&#xff1a; 一、算法特点 端到端的网络结构&#xff1a;Y…

项目:Boost 搜索引擎

项目&#xff1a;Boost 搜索引擎 1、项目背景 公司&#xff1a;百度、360、搜狗、谷歌 …站内搜索&#xff1a;搜索的数据更垂直&#xff08;相关&#xff09;&#xff0c;数据量小 2、整体框架 3、技术栈和项目环境 技术栈&#xff1a;C/C C11&#xff0c;STL&#xff0c;jso…

【JAVA毕设】基于JAVA的仓库管理系统

一、项目介绍 本系统前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router实现动态路由&#xff0c;Ajax实现前后端通信&#xff0c;Element-plus组件库使页面快速成型。后端部分&#xff1a;采用SpringBoot作为开发框架&#xff0c;同时集成MyBatis、Redis、…

C#中的LINQ之美:优雅的数据查询与操作

LINQ&#xff08;Language Integrated Query&#xff0c;语言集成查询&#xff09;是C#中一个强大的工具&#xff0c;它将查询功能直接融入到语言中&#xff0c;使开发者能够以一种更直观、更接近自然语言的方式来操作数据。LINQ不仅能极大地提高开发效率&#xff0c;而且让代码…

掌握ElasticSearch(五):查询和过滤器

一、查询和过滤器的区别 在 Elasticsearch 中&#xff0c;查询&#xff08;Query&#xff09;和过滤器&#xff08;Filter&#xff09;是用于检索和筛选数据的重要组成部分。它们虽然都能用来查找文档&#xff0c;但在性能和用法上有所不同。下面详细介绍查询和过滤器的概念以…

Lucas带你手撕机器学习——K近邻

K近邻 (K-Nearest Neighbor KNN) K近邻算法&#xff08;K-Nearest Neighbors, KNN&#xff09;是一种简单直观的机器学习算法&#xff0c;适用于分类和回归问题。它的核心思想是&#xff1a;判断一个数据点的类别或预测值时&#xff0c;参考它在特征空间中最近的 KKK 个数据点…

【2024】【字节青训营】:字节青训营入营测试题——Java版本(已提交通过)

目录 简单题目 计算x到y的最小步数 环状 DNA 序列的最小表示法 Base32 解码和编码 打点计时器 兔群繁殖之谜 完美整数 找出整数数组中占比超过 一半 的数 找出最长的神奇数列 找单独的数 字符串最短循环字串 二进制反码转换问题 中等题目 简单四则运算 数字翻译…

什么是微服务中的反应性扩展?

大家好&#xff0c;我是锋哥。今天分享关于【什么是微服务中的反应性扩展&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是微服务中的反应性扩展&#xff1f; Reactive Extensions 也称为 Rx。这是一种设计方法&#xff0c;我们通过调用多个服务来收集结果…