首页 > 其他分享 >CF121E Lucky Array

CF121E Lucky Array

时间:2023-06-11 11:22:59浏览次数:38  
标签:std 10 cnt int CF121E Lucky vector blk Array

思路

正解是线段树?然而我太菜了不会啊。。。

题目的数据范围是 \(10 ^ 5\),于是我们可以从分块的角度去思考这个问题。

打个表可以发现在题目给定的值域(\(10 ^ 4\))内满足条件的数一共只有三十个,于是这道题就简单了。先把数列分个块,然后对于每一块,维护一个区间加的标记和一个值域的标记,表示该块内每个数字的个数。对于区间加的操作,对散块就直接暴力累加,对整块就维护标记。对于查询的操作,对散块就暴力的验证其是否符合要求,而对整块就查询块内这三十个数的个数即可,还有就是记得查询时带上区间加的标记。

时间复杂度为 \(O(30 n \sqrt n)\),空间复杂度的话,由于对每一块都开了一个值域数组,所以是 \(O(10 ^ 4 \sqrt n)\)。

代码

#include <bits/stdc++.h>

using i64 = long long;

signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);

  std::unordered_set<int> encode;
  std::vector<int> decode;
  [&]() {
    for (int i = 1; i <= 10000; i++) {
      auto check = [](int num) -> bool {
        while (num) {
          if (num % 10 != 4 && num % 10 != 7) { return false; }
          num /= 10;
        }
        return true;
      };
      if (check(i)) { encode.insert(i), decode.push_back(i); }
    }
  }();

  int n, m;
  std::cin >> n >> m;

  int blk = std::sqrt(n + 0.5), cnt = n / blk + !!(n % blk);
  std::vector<int> st(cnt), ed(cnt), bln(n);
  for (int i = 0; i < cnt; i++) { st[i] = i * blk, ed[i] = (i + 1) * blk - 1; }
  ed[cnt - 1] = n - 1;
  for (int i = 0; i < n; i++) { bln[i] = i / blk; }

  std::vector<int> a(n);
  for (int i = 0; i < n; i++) { std::cin >> a[i]; }

  std::vector<std::vector<int>> f(cnt, std::vector<int>(1e4 + 1));
  std::vector<int> add(cnt);
  for (int i = 0; i < n; i++) { f[bln[i]][a[i]]++; }

  while (m--) {
    std::string opt;
    int l, r;
    std::cin >> opt >> l >> r;
    l--, r--;
    if (opt == "add") {
      int val;
      std::cin >> val;
      if (bln[l] == bln[r]) {
        for (int i = l; i <= r; i++) {
          f[bln[l]][a[i]]--, a[i] += val, f[bln[l]][a[i]]++;
        }
      } else {
        for (int i = l; i <= ed[bln[l]]; i++) {
          f[bln[l]][a[i]]--, a[i] += val, f[bln[l]][a[i]]++;
        }
        for (int i = st[bln[r]]; i <= r; i++) {
          f[bln[r]][a[i]]--, a[i] += val, f[bln[r]][a[i]]++;
        }
        for (int i = bln[l] + 1; i < bln[r]; i++) { add[i] += val; }
      }
    } else {
      int ans = 0;
      if (bln[l] == bln[r]) {
        for (int i = l; i <= r; i++) {
          if (encode.count(a[i] + add[bln[l]])) { ans++; }
        }
      } else {
        for (int i = l; i <= ed[bln[l]]; i++) {
          if (encode.count(a[i] + add[bln[l]])) { ans++; }
        }
        for (int i = st[bln[r]]; i <= r; i++) {
          if (encode.count(a[i] + add[bln[r]])) { ans++; }
        }
        for (int i = bln[l] + 1; i < bln[r]; i++) {
          for (auto j : decode) { 
            if (j < add[i]) { continue; }
            ans += f[i][j - add[i]]; 
          }
        }
      }
      std::cout << ans << "\n";
    }
  }

  return 0;
}

标签:std,10,cnt,int,CF121E,Lucky,vector,blk,Array
From: https://www.cnblogs.com/forgot-dream/p/17472704.html

相关文章

  • js 中 对 Array 的操作
    判断数组中是否包含指定的多个值1、every()方法的定义与用法:every()方法用于检测数组中的所有元素是否都满足指定条件(该条件为一个函数)。every()方法会遍历数组的每一项,如果有有一项不满足条件,则表达式返回false,剩余的项将不会再执行检测;如果遍历完数组后,每一项都符合条,则返......
  • boost.array 使用实例
    #include<iostream>//z包含array相关头文件。#include<boost/array.hpp>usingnamespacestd;usingnamespaceboost;//z仿函数,输出array各元素。classPrintInt{private:intsum;intcnt;public:PrintInt(intval):sum(......
  • 【已解决】可视化ValueError Cannot mask with non-boolean array containing NA NaN
    bug:raiseValueError(na_msg)ValueError:Cannotmaskwithnon-booleanarraycontainingNA/NaNvalues对应的代码:asian_countries=region_data.dropna(subset=['CountryCode'])[region_data['Region'].str.contains('Asia')][&......
  • 8.22 字符串统计 toCharArray
    统计字符串中"n","o"出现的次数classStringUtil{//返回第一个内容为字母n的个数,第二个内容为字母o的个数publicstaticint[]count(Stringstr){intcountData[]=newint[2];char[]data=str.toCharArray();//将字符串变成字符数组,其中空......
  • ArrayBox封装
    设计一个类替代数组可以做的事情 数组长度是固定存储一组元素 长度一旦固定使用起来不太方便添加元素删除元素 设计一个类---充当一个小容器ArrayBox 能添加元素获取元素删除元素看一看到底有几个//你们是使用者(用户)         ......
  • Codeforces 1588F - Jumping Through the Array
    显然无法用polylog的数据结构维护,序列分块也不行,考虑询问分块。每\(B\)个询问处理一次。将这个询问中\(2,3\)操作涉及到的点设为“关键点”,那么容易发现,环上每一段以关键点结尾的链在这块操作的过程中始终保持不变,也就是说我们可以把它们缩在一起。先预处理出每个块的增量......
  • 关于TChunkedArray和UE5的ECS框架Mass
    在虚幻引擎中,TChunkArray是一个动态数组类型。它通过分配一系列固定大小的Chunk来管理Array中的元素。每个Chunk具有以下特征:1.固定大小,通常为4096个元素。该大小在TChunkArray定义时指定,之后所有Chunk的大小都是一致的。2.可以连续或不连续的分配在内存中。TChunk......
  • “AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学
    1.“AIEarth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学、Xarray使用教学,针对气象领域.nc文件读取处理比赛官网:https://tianchi.aliyun.com/specials/promotion/aiearth2021?spm=a2c22.12281976.0.0.4d0d19efK2FngK1.1背景描述聚焦全球大气海......
  • Interesting Array 题解
    InterestingArray题目大意构造一个序列\(a\),使其满足若干限制条件,每个限制条件是形如lrq的式子,其意义是:\(\&_{i=l}^ra_i=q\)。题意分析看上去是构造题,实际上是数据结构题。我们不妨先令初始时\(a\)为一个全\(0\)序列,再逐一看每个限制条件。为了满足某一个限制条件......
  • [LeetCode] 2460. Apply Operations to an Array
    Youaregivena 0-indexed array nums ofsize n consistingof non-negative integers.Youneedtoapply n-1 operationstothisarraywhere,inthe ith operation(0-indexed),youwillapplythefollowingonthe ith elementof nums:If nums[i]......