首页 > 其他分享 >Solution - Codeforces 1217E Sum Queries?

Solution - Codeforces 1217E Sum Queries?

时间:2024-11-12 21:45:53浏览次数:1  
标签:node 1217E int Sum mn Solution 一位 smn 进位

对于这个“好的”的判定条件看起来有点奇怪,不妨结合上题目要求的“最小 \(sum\)”一起考虑。

因为要最小化 \(s_p\),所以一个比较直观的想法是先从选的数个数入手。
考虑到如果选的只有 \(1\) 个数 \(a_i\),那么 \(sum = a_i\),一定是好的,排除。
如果选的是 \(2\) 个数 \(a_i, a_j\),那么有 \(sum = a_i + a_j\)。
考虑到加法可能带有进位的操作,但实际上可以通过从低位到高位来讨论解决:

  • 若这一位 \(a_i, a_j\) 均为 \(0\),则这一位一定是好的,那就继续往高位看。
  • 若这一位 \(a_i, a_j\) 有一个为 \(0\),那么这一位也是好的,那就继续往高位看。
  • 若这一位 \(a_i, a_j\) 均不为 \(0\),那么这一位一定是坏的。
    需要注意的是因为是从低位往高位看的,所以下面一定不产生进位,可以暴力枚举每一位的数值,可以知道一定无法匹配上。

于是可以发现的是,只要存在一位满足 \(a_i, a_j\) 在此位均不为 \(0\),那么 \(sum = a_i + a_j\) 就是合法的。

考虑扩展到更多数,能够发现其实越多数限制反而越难满足。
但是此时一个位是坏的肯定也需要满足至少存在一位,非 \(0\) 的个数 \(\ge 2\):

  1. 如果是因为进位导致这一位变坏,那么有进位也需要下面有位的非 \(0\) 的个数 \(\ge 2\)。
  2. 如果没有进位,那么只有 \(0, 1\) 个肯定不行,所以肯定需要 \(\ge 2\)。

所以可以发现,选更多的数反而不如就选 \(2\) 个。

那么接下来的问题就变为:
找到 \(l\le i, j\le r\),满足存在一位满足 \(a_i, a_j\) 在此位均不为 \(0\),最小化 \(a_i + a_j\)。

能够发现此时每一位都是独立的,那么就可以对每一个位去做。
对每一位开一个线段树维护这一位非 \(0\) 的数的最大和次大值,修改和查询对于每颗线段树都问一下就可以了。

时间复杂度 \(\mathcal{O}((n + m)\log n\log_10 V)\)。

#include<bits/stdc++.h>
constexpr int inf = 2e9;
constexpr int maxn = 2e5 + 10;
int n, q;
struct node_t {
   int mn, smn;
   inline node_t(int mn_ = inf, int smn_ = inf) {
      mn = mn_, smn = smn_;
   }
   inline node_t operator + (const node_t &a) const {
      if (mn <= a.mn) {
         return node_t(mn, std::min(smn, a.mn));
      } else {
         return node_t(a.mn, std::min(mn, a.smn));
      }
   }
};
struct segtr {
   node_t tr[maxn * 4];
   inline void update(int x, int y, int k = 1, int l = 1, int r = n) {
      if (l == r) {
         return tr[k] = node_t(y), void();
      }
      int mid = l + r >> 1;
      if (x <= mid) update(x, y, k << 1, l, mid);
      else update(x, y, k << 1 | 1, mid + 1, r);
      tr[k] = tr[k << 1] + tr[k << 1 | 1];
   }
   inline node_t query(int x, int y, int k = 1, int l = 1, int r = n) {
      if (x <= l && r <= y) return tr[k];
      int mid = l + r >> 1;
      if (y <= mid) return query(x, y, k << 1, l, mid);
      if (x  > mid) return query(x, y, k << 1 | 1, mid + 1, r);
      return query(x, y, k << 1, l, mid) + query(x, y, k << 1 | 1, mid + 1, r);
   }
} tr[10];
inline void update(int p, int x) {
   for (int d = 0, x_ = x; d < 10; d++, x_ /= 10) {
      tr[d].update(p, x_ % 10 ? x : inf);
   }
}
int main() {
   scanf("%d%d", &n, &q);
   for (int i = 1, x; i <= n; i++) {
      scanf("%d", &x);
      update(i, x);
   }
   for (int op, x, y; q--; ) {
      scanf("%d%d%d", &op, &x, &y);
      if (op == 1) {
         update(x, y);
      } else {
         int ans = -1;
         for (int d = 0; d < 10; d++) {
            node_t val = tr[d].query(x, y);
            if (val.smn == inf) continue;
            int tot = val.mn + val.smn;
            if (tot < ans || ans == -1) {
               ans = tot;
            }
         }
         printf("%d\n", ans);
      }
   }
   return 0;
}

标签:node,1217E,int,Sum,mn,Solution,一位,smn,进位
From: https://www.cnblogs.com/rizynvu/p/18542664

相关文章

  • ResumeSDK简历解析库编程案例
    目录1、软件概述2、编程案例2.1、官网案例(阿里云)2.2、优化案例3、解析结果1、软件概述ResumeSDK简历解析是北京无奇科技有限公司研发,业界领先的智能简历解析和人岗匹配算法厂商,提供专业的AI招聘技术服务,致力于人力资源行业智能化这一进程。并已经上线阿里云或腾讯云,......
  • 力扣 170. 两数之和 III - 数据结构设计 two-sum III
    数组系列力扣数据结构之数组-00-概览力扣.53最大子数组和maximum-subarray力扣.128最长连续序列longest-consecutive-sequence力扣.1两数之和N种解法two-sum力扣.167两数之和IItwo-sum-ii力扣.170两数之和IIItwo-sum-iii力扣.653两数之和IVtwo-sum-IV力......
  • 2025年第五届消费电子与计算机工程国际学术会议(ICCECE 2025) 2025 5th International
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz三、大会介绍四、出席嘉宾五、征稿主题如想"投稿"请点击如下图片......
  • [LeetCode] 2841. Maximum Sum of Almost Unique Subarray
    Youaregivenanintegerarraynumsandtwopositiveintegersmandk.Returnthemaximumsumoutofallalmostuniquesubarraysoflengthkofnums.Ifnosuchsubarrayexists,return0.Asubarrayofnumsisalmostuniqueifitcontainsatleastmdisti......
  • 题解:AT_abc379_e [ABC379E] E - Sum of All Substrings
    很水的一道题。我们先把题目上各地的数字看成一个序列,然后考虑计算该序列分别会对答案的每一位产生多少贡献。具体的,我们从后往前考虑答案的每一位。通过简单推演可知,设你当前考虑到答案的第\(i\)个数字,那么原序列对这一位的贡献为\(\sum_{j=1}^{n-i+1}a_j\timesj\)。这个......
  • [ARC158C] All Pair Digit Sums 题解
    C-AllPairDigitSums题意:设\(f(x)\)为\(x\)的数字和。例如\(f(158)=1+5+8=14\)。给定一个长度为\(N\)的正整数序列\(A\),求\(\sum_{i=1}^{N}\sum_{j=1}^{N}f(A_i+A_j)\)。分析:首先明确\(f(x)\)为\(x\)的数位和。举例情况:若有两个数分别为:\(12,21\)。\[f(......
  • 110_api_intro_ai_summarize-text
    文本多语言AI摘要API数据接口文本/文本摘要AI生成文本摘要AI处理/智能摘要。1.产品功能支持多语言摘要生成;支持长文本处理;基于AI模型,持续迭代优化;不存储PDF文件,处理完即释放,保证您的文档安全;全接口支持HTTPS(TLSv1.0/v1.1/v1.2/v1.3);全面兼容Ap......
  • 109_api_intro_ai_summarize-pdf
    PDF全文多语言AI摘要API数据接口PDF/文本摘要AI生成PDF文档摘要AI处理/智能摘要。1.产品功能支持多语言摘要生成;支持formdata格式PDF文件流传参;快速处理大文件;基于AI模型,持续迭代优化;不存储PDF文件,处理完即释放,保证您的文档安全;全接口支持HTTP......
  • [python turtle summary] Python 海龟画图 函数总结
    Turtle文档导入turtleimportturtleastimportturtlefromturtleimport*Turtle函数方法移动和绘制penup()抬笔pendown()落笔goto(x,y)移动forward(distance)|fd(distance)前进backward(distance)|back(distance)|bk(distance)后退right(angle)|rt(ang......
  • 【大数据学习 | kafka】简述kafka的消费者consumer
    1.消费者的结构能够在kafka中拉取数据进行消费的组件或者程序都叫做消费者。这里面要涉及到一个动作叫做拉取。首先我们要知道kafka这个消息队列主要的功能就是起到缓冲的作用,比如flume采集数据然后交给spark或者flink进行计算分析,但是flume采用的就是消息的push方式,这个......