首页 > 其他分享 >数组构建_cfECR162_C. Find B

数组构建_cfECR162_C. Find B

时间:2024-02-28 22:55:08浏览次数:26  
标签:cfECR162 const int ll long 数组 Find define

目录

问题概述

原题参考:C. Find B
对于一个数组a,给出m次咨询,问对于每一次询问的区间是否可以构建出另外一个好的数组b,对于a的好数组的定义是

  • a数组和b数组的元素和相同
  • a数组和b数组的每一位不同
  • b数组的每一位是正数

思路分析

对于第一个条件和第二个条件,其实可以发现对于任意两个元素,一增一减即可,也就是保持增减平衡,但是由于第三个条件的要求,因此元素1是没有办法减的,只能向上加,其余的元素都是可以减的。因此对于一个区间,只需要判断其中1的个数和其余元素减到1的和的比较即可,当其余元素的和可以满足1的增需求,那么就可以构造数组,否则不可以构造数组

参考代码

#include <bits/stdc++.h>
using namespace std;
#define FAST_IO ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define endl '\n'
#define pll pair<long long, long long>
#define pii pair<int, int>
#define vi vector<int>
#define vl vector<long long>
#define ll long long
#define ull unsigned long long
const ll INF = 9187201950435737471;
const int inf = 2139062143;
const ll mod = 1e9 + 7;
const double eps = 1e-6;
const double PI = acos(-1.0);
const int N = 3e5+7;
ll n, m, a[N], pre[N], one[N];
void solve() {
    cin >> n >> m;
    for(int i=1; i<=n; i++) {
        cin >> a[i];
        one[i] = (a[i] == 1 ? 1 : 0) + one[i-1];
        pre[i] = pre[i-1] + a[i] - 1;
    }
    int lt, rt;
    while(m --) {
        cin >> lt >> rt;
        if(lt == rt) cout << "NO" << endl;
        else {
            ll cntOne = one[rt] - one[lt-1], change = pre[rt] - pre[lt-1];
            if(cntOne <= change) cout << "YES" << endl;
            else cout << "NO" << endl;
        }
    }
}
int main() {
#ifdef xrl
    freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout);
#endif
    FAST_IO;
    int t = 1;
    cin >> t;
    while(t --) solve();
#ifdef xrl
    cout << "Time used = " << (double)(clock() * 1.0 / CLOCKS_PER_SEC) << "s";
#endif
    return 0;
}

问题反思

还想复杂了,事实就是根据复杂的来想,走不出来emmm

标签:cfECR162,const,int,ll,long,数组,Find,define
From: https://www.cnblogs.com/notalking569/p/18042236

相关文章

  • 数组关系_ABC342_D - Square Pair
    目录问题概述思路想法参考代码问题反思问题概述原题参考:D-SquarePair对于长度为n的数组,给出满足要求的数对对数:i<ja[i]*a[j]是一个平方数思路想法其实和以前的数组关系那题差不多,也是找关系,就是关系找不出来而已,对于两数相乘为平方数应该怎么考虑,可以知道对于任意数......
  • 二维数组传参数
    1array<array<int,5>,5>arr;2for(intii=0;ii<arr.size();ii++)3{4for(intjj=0;jj<arr[ii].size();jj++)5{6arr[ii][jj]=jj*10+ii;7}8}9func(arr);1template<typenameT>2voidfunc(c......
  • JAVA基础:数组常见案例
    1.数组找最值packagecom.itheima.arry;publicclassArrayDemo7{publicstaticvoidmain(String[]args){//掌握数组元素求最值int[]faceScore={15,9000,10000,20000,9500,-5};intmax=faceScore[0];for(inti=1;i<faceS......
  • JAVA基础:数组在计算机中的执行原理 多个变量指向一个数组
    程序都是在计算机中的内存中执行的,java程序编译之后会产生一个class文件,这个class文件是提取到内存中的JVM虚拟机中执行的。java为了便于虚拟机这个java程序,也即这个class文件。将虚拟机这块内存区域进行了划分:方法区,栈,堆,  本地方法栈,程序计数器方法区:放编译后的class文件的......
  • 树状数组理解方式
     tr[i]节点存储的是a[i-lowbit(i)+1]+……+a[i],一共lowbit(i)个数字之和。query的理解:intquery(intk){intres=0;for(inti=k;i;i-=lowbit(i))res+=tr[i];returnres;}每次减去当前的lowbit,就可以退回到上一个区间,直至到0modify的......
  • c语言进行时4-函数与数组
    什么是函数?函数是一块代码,接收零个或多个参数,做一件事情,并返回零个或者一个值。函数定义:本地变量(局部变量):函数的每次运行,就产生了而一个独立的变量空间,在这个空间的变量,是函数的这次运行所独有的,称作本地变量,也称局部变量。定义在函数内部的变量就是本地变量。参数也是本地......
  • 350. 两个数组的交集 II C
    /***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/intmin(inti,intj){if(i<j)returni;returnj;}int*intersect(int*nums1,intnums1Size,int*nums2,intnums2Size,int*returnSize){inthash1[1001]=......
  • JAVA基础:数组遍历
    遍历:一个一个访问 packagecom.itheima.arry;publicclassArryDemo2{publicstaticvoidmain(String[]args){//掌握数组遍历int[]ages=newint[]{12,24,36};//System.out.println(ages[0]);//System.out.println(ages[1]);......
  • JAVA基础:数组访问
     packagecom.itheima.arry;publicclassArryDemo1{publicstaticvoidmain(String[]args){//掌握数组访问int[]ages=newint[]{12,52,630};//修改数组中数据ages[0]=66;ages[1]=100;System.out.println(......
  • 349. 两个数组的交集C
    /***Note:Thereturnedarraymustbemalloced,assumecallercallsfree().*/int*intersection(int*nums1,intnums1Size,int*nums2,intnums2Size,int*returnSize){inthash1[1001]={0};inthash2[1001]={0};int*tem=(int*)malloc(sizeof......