首页 > 其他分享 >[AGC040D] Balance Beam

[AGC040D] Balance Beam

时间:2023-12-07 21:45:44浏览次数:33  
标签:le AGC040D res sum Beam int ans Balance LL

[AGC040D] Balance Beam

颇有难度的一道题。

首先思考我们的手上有什么武器可以使用。发现如果石板的排列确定下来,那么合法的 B 一定是形如 \([0, x)\) 的一段区间。我们只需令 \(x\) 最大即可。同时,显然可以认为终点一定在整点上。题目中很为难我们的一点是位置并不是离散的,所以自然想到图像。但是我没想到图像,所以只好先假装位置是离散的看一下有什么做法。

考虑寻找充要条件,假设 B 从 \(x\) 点,在 \(y\) 点被逮住,那么充要条件是:

\[\sum_{i \le y} A_i \le \sum_{x < i \le y} B_i \]

考虑分离 \(x, y\) 这两个变量。变为 \(\sum_{i \le x} A_i + \sum_{x < i \le y} (A_i - B_i) \le 0\)

好了,现在把排列丢掉,问题转化为划分两个不交的集合 \(S, T\) 使得

\[s = \sum_{i \in S} A_i + \sum_{i \in T} (A_i - B_i) \le 0 \]

最大化 \(|S|\)。

这样就有一个简单的贪心做法了:注意到 \(A_i\) 一定是正的,而 \(A_i - B_i\) 可能是负的,所以初始把所有会使 \(s\) 减小的 \(i\) 划分入 \(T\),然后贪心选代价最小的加入 \(S\),直到不能选为止。

现在回到原问题,自然想到枚举分界点然后转化成上面的问题。怎么做呢?注意到由于终点一定是整点,所以分界点这一段必然要么处于 B 左侧,要么在 B 和终点中间。去掉这一段,我们希望选择尽可能多的整点,所以初始时先令 \(s\) 尽可能的小,然后在通过二分优化贪心地过程,最后单独算这个散段的最值就行了。什么叫令 \(s\) 尽可能的小呢?就是不管怎样都先加上一个当前段的 \(A_i - B_i\),由于 \(i\) 要么出现在 \(S\) 中要么出现在 \(T\) 中,所以这个做法是正确的。

const int N = 1e5 + 10;

struct Frac {
  LL x, y;
  void check() {
    LL d = __gcd(x, y);
    x /= d, y /= d;
  }
  bool operator < (const Frac &rhs) const {
    return (__int128)x * rhs.y < (__int128)rhs.x * y;
  }
};

int n;
LL a[N], b[N];
struct item {
  int id;
  LL c;
}c[N];
int p[N];
LL pre[N];

int main() {
  read(n);
  for(int i = 1; i <= n; ++i)
    read(a[i], b[i]);
  LL sum = 0;
  for(int i = 1; i <= n; ++i) {
    c[i].id = i;
    if(b[i] >= a[i]) {
      sum += b[i] - a[i];
      c[i].c = -b[i];
    } else {
      c[i].c = -a[i];
    }
  }
  sort(c + 1, c + n + 1, [](item x, item y) {
    return x.c > y.c;
  });
  for(int i = 1; i <= n; ++i)
    p[c[i].id] = i, pre[i] = pre[i - 1] + c[i].c;
  Frac ans = {0, 1};
  for(int i = 1; i <= n; ++i) {
    LL s = sum;
    if(b[i] < a[i]) s += b[i] - a[i];
    int pos = 0;
    for(int l = 1, r = n; l <= r; ) {
      int mid = (l + r) / 2;
      LL sum = pre[mid] - (mid >= p[i]) * c[p[i]].c;
      if(s + sum >= 0) pos = mid, l = mid + 1;
      else r = mid - 1;
    }
    LL sum = s + (pre[pos] - (pos >= p[i]) * c[p[i]].c);
    Frac res;
    res = (Frac){(pos - (pos >= p[i])) * b[i] + min(sum, b[i]), b[i]};
    if(res.x < 0) continue;
    res.check();
    if(ans < res) ans = res;
  }
  ans.y *= n;
  ans.check();
  printf("%lld %lld\n",ans.x,ans.y);
}

标签:le,AGC040D,res,sum,Beam,int,ans,Balance,LL
From: https://www.cnblogs.com/DCH233/p/17884043.html

相关文章

  • CF1902 A Binary Imbalance 题解
    LinkCF1902ABinaryImbalanceQuestion给出一个01串,可以在任意一个位置\(i\)插入一个字符,如果\(a_i\nea_{i+1}\)插入的字符为\(0\)否则插入的字符为\(1\)问,是否可以通过任意次操作使得串中\(0\)的数量比\(1\)多Solution如果一个串都为\(0\)肯定符合都......
  • The 2023 ICPC Asia Hefei Regional Contest Test D. Balanced Array
    Preface这题赛场上出了个关键点基本都想到的做法,但因为一个地方卡住了没过去导致不得不选择弃掉这道题赛后补了下发现\(O(n\logn)\)的做法是只差临门一脚了,但\(O(n)\)的做法还是trick性挺强的Solution首先考虑枚举\(k\),不难发现此时合法的前缀一定是个连续的区间,其中区间的......
  • Codebeamer—软件全生命周期管理轻量级平台
    产品概述    Codebeamer涵盖了软件研发的生命周期,在一个整合的平台内支持需求管理、测试管理、软件开发过程管理以及项目管理等,同时具有IToperations&DevOps相关的内容,并支持变体管理的功能。对于使用集成的应用程序生命周期管理(ALM)来简化、加快交付的产品开发团队和组织......
  • Beamforming 原理和背景
    转自知乎 https://zhuanlan.zhihu.com/p/110251527关于Beamforming,现在越来越多的走入了实际生活中。最先将Beamforming带入实际生产生活中的应该是802.11n,但当时还是optional,而不是critical,直接导致大部分当时的产品没有上Beamforming技术。如今,技术的发展,Beamforming已经......
  • 【刷题笔记】110. Balanced Binary Tree
    题目Givenabinarytree,determineifitisheight-balanced.Forthisproblem,aheight-balancedbinarytreeisdefinedas:abinarytreeinwhichthedepthofthetwosubtreesofeverynodeneverdifferbymorethan1.Example1:Giventhefollowingtree......
  • VMware NSX Advanced Load Balancer (NSX ALB) 22.1.5 - 多云负载均衡平台
    VMwareNSXAdvancedLoadBalancer(NSXALB)22.1.5-多云负载均衡平台应用交付:多云负载均衡、Web应用防火墙和容器Ingress服务请访问原文链接:https://sysin.org/blog/vmware-nsx-alb-22/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org负载均衡平台NSXAdvan......
  • Balance Addicts 题解
    BalanceAddicts题目大意给定序列\(a\),求有多少种合法的划分方案。定义一种划分方案是合法的当且仅当划分出的各段序列的和构成回文序列。思路分析一种不太一样的做法。我们先对\(a\)做一遍前缀和,得到\(s\)。观察各段序列的和形式:\[s_{p_1},s_{p_2}-s_{p_1},s_{p_3}......
  • Maximum Balanced Circle
    here首先根据题意,我们不难有数字是连续的这种感悟。而且限制是值域上的,从下标入手发现难以突破,便从值域上入手。从小到大考虑每个数字,然后dp,可以参考这篇题解。至于方案的输出,有两种情况。只有自己\(i\)和\(i-1\),直接输出即可。有自己和\(i-1\)的环,定义print输出环,且最大......
  • HDFS Balancer存储水位稳定性原理与实践
    1.背景在HDFS分布式系统中,经常会上线新的datanode以环境集群容量不足的问题。但是往往旧datanode水位较高,甚至爆满无法写入,新datanode非常空闲,导致旧机器无法写入数据,集群的流量集中到新datanode中,造成新datanode网络延迟。为了解决上述问题,可以通过Balancer工具定时讲高水位dat......
  • SpringCloud复习:(2)@LoadBalanced注解的工作原理
    @LoadBalanced注解标记了一个RestTemplate或WebClientbean使用LoadBalancerClient来进行负载均衡。LoadBalancerAutoConfiguration类给带注解的@RestTemplate添加了拦截器:LoadBalancerInterceptor.具体流程如下:首先定义一个LoadBalancerInterceptor然后定义了一个RestTemplateC......