首页 > 其他分享 >Codeforces Round 689 (Div. 2, based on Zed Code Competition)D.Divide and Summarize

Codeforces Round 689 (Div. 2, based on Zed Code Competition)D.Divide and Summarize

时间:2023-04-22 23:34:18浏览次数:39  
标签:md Code based Divide int mid 数组 return define

题意:

我们给定包含n个正整数的数组,我们可以对这个数组执行一些操作之后,可以让数组内元素的和成为我们想要的数

我们对数组的执行操作一共分为三个步骤,第一个步骤是我们首先计算出数组的中间值mid。这里mid的定义不是中位数也不是均值,而是最大值和最小值的均值。也就是mid = (min + max) / 2。

得出了mid之后,我们根据数组当中元素的大小将数组分成两个部分。将小于等于mid的元素分为第一个部分,将大于mid的元素分为第二个部分。这样相当于我们把原来的大数组转化成了两个不同的小数组。

现在我们一共有q个请求,每个请求包含一个整数k。我们希望程序给出我们能否通过上述的操作使得最终得到的数组内的元素和等于k。

如果可以输出Yes,否则输出No。

题解:

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

#define endl '\n'
#define LL long long
#define ph push_back
#define INF 0x3f3f3f3f
#define PII pair<int, int>
const int N = 1e5 + 10;
int t;
int n, q, k;
int a[N];
LL b[N];
set<LL> s;
int binary_serch(int l, int r, int val)
{

  while (l + 1 != r)
  {
    int mid = (l + r) >> 1;
    if (a[mid] <= val)
      l = mid;
    else
      r = mid;
  }
  return l;
} //二分找到左数组的右端点
void pre_query(int l, int r)
{
  if (l > r)
    return;
  if (l == r)
  {
    s.insert(a[l]);
    return;
  }                          //如果数组长度为1这点一定能查到,插入set
  s.insert(b[r] - b[l - 1]); //插入该数组的和
  int val = (a[r] + a[l]) / 2;
  int md = binary_serch(l - 1, r + 1, val);
  if (md == r)
    return;
  pre_query(l, md);
  pre_query(md + 1, r);
} //离线查询,把所有能查到的值k借助set存储
void solve()
{
  s.clear();
  memset(b, 0, sizeof b);
  cin >> n >> q;
  for (int i = 1; i <= n; i++)
  {
    cin >> a[i];
  }
  sort(a + 1, a + 1 + n);
  for (int i = 1; i <= n; i++)
  {
    b[i] = a[i] + b[i - 1];
  } //构造前缀和方便求解数组总和
  pre_query(1, n);
  for (int i = 1; i <= q; i++)
  {
    cin >> k;
    if (s.find(k) != s.end())
      puts("Yes"); //这里set的find函数返回是迭代器,!=end()说明找到了,奇怪的用法
    else
      puts("No");
  }
}
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(nullptr), cout.tie(nullptr);
  cin >> t;
  // t=1;
  while (t--)
  {
    solve();
  }
  return 0;
}

 

 

标签:md,Code,based,Divide,int,mid,数组,return,define
From: https://www.cnblogs.com/xumaolin/p/17344451.html

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:搜索旋转排序数组
    题目:整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2,4,5,6,7]在下标3处......
  • #yyds干货盘点# LeetCode面试题:柱状图中最大的矩形
    1.简述:给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1。求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例1:输入:heights=[2,1,5,6,2,3]输出:10解释:最大的矩形为图中红色区域,面积为10示例2:输入:heights=[2,4]输出:42.代码实现:classSolut......
  • AtCoder Beginner Contest 283 Ex Popcount Sum
    洛谷传送门AtCoder传送门记录一下这个神奇的套路。首先有\(\operatorname{popcount}(n)=n-\sum\limits_{i=1}^{\infty}\left\lfloor\frac{n}{2^i}\right\rfloor\)。证一下:\[\operatorname{popcount}(n)=\sum\limits_{i=0}^{\infty}\left\lfloor\dfrac{n}{2^i}\right......
  • 为什么重写equals方法就一定要重写hashCode方法
    在hashMap和hashTable集合中,元素是不能够重复的,所以我们在添加元素时,先要判断是否存在这个元素。而判断的方法就是先用hashCode方法判断哈希值是否相同,如果哈希值相同,再使用equals判断是否相同,如果都相同,则才证明两个元素不同。而如果哈希值不同,则不会进行后续的equals判断。哈希......
  • 【DP】LeetCode 1143. 最长公共子序列
    题目链接1143.最长公共子序列思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素......
  • AtCoder Regular Contest 115 D Odd Degree
    洛谷传送门AtCoder传送门若连通块是一棵树,考虑钦定\(k\)个点为奇度点,方案数为\(\binom{n}{k}\)。对于叶子,如果它是奇度点,那么连向它父亲的边要保留,否则不保留。这样自底向上考虑,任意一条边的保留情况都可以唯一确定,所以最后方案数就是\(\binom{n}{k}\)。若连通块存在环,仍......
  • VSCode + GCC编译器(MinGW)开发环境中文字符乱码问题踩坑与解决办法
    目录问题背景问题描述测试代码测试结果现象描述问题分析解决方案修改默认配置1.已经存在的文件全部使用gbk编码重新保存。2.在工程目录下新建.vscode目录,如果已存在则跳过此步骤。3.在.vscode目录中新建settings.json,launch.json两个文件,已有则跳过。4.settings.json文件添加......
  • 前端工具vscode将英文设置中文简单方便
    按照步骤来: 右下角会有提示,点击重启即可 然后vscode就变成中文的了 ......
  • 20220626leetcode周赛(前3道)
    title:20220622leetcode周赛(前3道)第一题,难度:简单6101.判断矩阵是否是一个X矩阵题目描述:如果一个正方形矩阵满足下述全部条件,则称之为一个X矩阵:矩阵对角线上的所有元素都不是0矩阵中所有其他元素都是0给你一个大小为nxn的二维整数数组grid,表示一个正方形......
  • leetcode200.岛屿数量
    title:leetcode200.岛屿数量题目描述:给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[["1","1","1","......