首页 > 其他分享 >AT_arc166_d [ARC166D] Interval Counts

AT_arc166_d [ARC166D] Interval Counts

时间:2024-07-14 22:41:37浏览次数:14  
标签:int rep Interval rd ans ARC166D linf Counts 我们

我们可以将题转化为选择若干区间,给区间中的每个 \(y_i\) 减一,这样我们就可以将问题转化为差分了。

我们枚举区间的左端点,从左到右枚举,当我们枚举到 \(i\) 时,显然如果当前差分数组 \(d_i>0\),那么我们需要将其减去 \(d_i\),这样我们获得了一个向后加总共 \(d_i\) 个 \(1\) 的机会,此时我们维护数列从左往右第一个 \(d_p\) 小于 \(0\) 的 \(p\),然后我们每次进行不断地加减并将 \(p\) 往后挪,到 \(n+1\) 即可停止。那么这样为什么是对的?因为如果我们将这个小于 \(0\) 的交给一个左端点大于 \(i\) 的 \(j\) 处理,那么由于 \(x_j>x_i\),所以一定不优。

该如何计算答案?我们注意到对于任意在序列中 \(l\) 到 \(r\) 的区间,\(L_i\) 取 \(x_{l-1}+1\),\(R_i\) 取 \(x_{r+1}-1\) 显然最优,为了方便我们将 \(x_0\) 赋值为 \(-\inf\),将 \(x_{n+1}\) 赋值为 \(\inf\) 即可。

时间复杂度 \(\mathcal{O}(n)\)。

代码:

int n;
int x[N], y[N], d[N];
int l[N], r[N];
signed main ()
{
  n = rd ();
  x[0] = - linf, x[n + 1] = linf;
  rep (i, 1, n) x[i] = rd ();
  rep (i, 1, n) l[i] = x[i - 1] + 1, r[i] = x[i + 1] - 1;
  rep (i, 1, n) y[i] = rd (), d[i] = y[i] - y[i - 1];
  int p = 1;
  while (d[p] >= 0) ++ p;
  int ans = linf;
  rep (i, 1, n)
  {
    int x = d[i];
    if (! x) continue;
    while (x)
    {
      while (d[p] >= 0 && p <= n) ++ p;
      if (p > n) break;
      ans = min (ans, r[p - 1] - l[i]);
      if (- d[p] > x) d[p] += x, x = 0;
      else
      {
        x += d[p], d[p] = 0;
      }
    }
  }
  if (ans >= 1e10) puts ("-1"); else printf ("%lld\n", ans); 
}

标签:int,rep,Interval,rd,ans,ARC166D,linf,Counts,我们
From: https://www.cnblogs.com/lalaouyehome/p/18302153

相关文章

  • Oracle PL / SQL INTERVAL数据类型
    INTERVALYEARTOMONTH数据类型INTERVALYEARTOMONTH存储和操作年和月的间隔。语法是:INTERVALYEAR[(precision)]TOMONTHprecision指定“years”字段中的数字位数。我们必须在0..4的范围内使用整数字面值。默认值为2。以下代码显示如何将字面值分配到INTERVALY......
  • P4747 [CERC2017] Intrinsic Interval
    先说线段数做法发现一个区间连续有一个性质:这个区间\([l,r]\)存在相邻两个数的对数是\(r-l\)考虑离线下来,线段数维护每个区间存在相邻数的对数,当前是\(i\),每次扫描新的一个\(a[i]\)进来,因为我扫描线是钦定了以\(i\)位右端点,所以若\(a[i]-1\)的位置在\(a[i]\)前面,我就将\([1,a[i]......
  • D - Intersecting Intervals(abc355)
    题意:有n个区间,找出俩俩区间相交的个数分析:设初始俩俩相交,找出不相交的(不同区间l>r),减去即可#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;intmain(){   ios::sync_with_stdio(false);   intn,l[n+10],r[n+10];   cin>>n;  ......
  • [题解]AT_dp_w Intervals
    思路首先考虑较为普通的DP。定义\(dp_{i,j}\)表示在前\(i\)个位置中,最后一个1在\(j\)的最大分数,显然有:\[dp_{i,j}=\left\{\begin{matrix}\max_{k=1}^{i-1}\{dp_{i-1,k}\}+\sum_{l_k\leqj\wedger_k=i}{a_k}&(i=j)\\dp_{i-1,j}+\sum......
  • 核心(Hutool-core)日期时间(计时器工具-TimeInterval)
    Hutool通过封装TimeInterval实现计时器功能,即可以计算方法或过程执行的时间。TimeInterval支持分组计时,方便对比时间。使用TimeIntervaltimer=DateUtil.timer();//---------------------------------//-------这是执行过程//---------------------------------timer.int......
  • 五月踩坑指南之clearInterval()定时器不起效果
    clearInterval定时器不起效果问题代码解决方案:将定时器增加到数组内,循环清除另外的方案问题代码lettimer=nulltimer=setInterval(()=>{执行的方法},1000)timer=setInterval(()=>{执行的方法},1000)if(timer){clearInterval(this.timer)timer=null;}此......
  • ABC 355 D题Intersecting Intervals
    题意现在有n条线段,每条线段的左端点和右端点依次给出,求有多少对线段有交集。思路考虑正难则反的想法,我们考虑着n条线段全部两两相交的时候,那么答案就是(n-1)*n/2,现在我们要求出有多少对线段是不相交的。当两条线段不相交的时候,显然有其中一条线段的左端点严格大于另一条线......
  • CF1089I Interval-Free Permutations
    标签:析合树析合树就是用来处理这一种值域连续段的问题的。OI-wiki上对于析合树的讲解。我们回顾一下题目,要求不存在长度为\([2,n-1]\)之间的连续段,换句话说,就是根节点下恰有\(n-1\)个节点,且没有任何一个字段是题目中要求的连续段。我们记这样的答案为\(A_n\)也就......
  • D - Intersecting Intervals
    D-IntersectingIntervals 思路对于区间重合问题,经典做法对left进行排序,然后进行统计计数。写了一版TLE,反思有冗余计数问题。计算每一个区间的覆盖数目,不需要TLE版本逐个往后数,只需要使用lower_bound找出第一个大于等于ri+1 的位置,即可得到与i区间重合区间......
  • setTimeout模拟interval
    functionrunTimer(list=[ { delay:2000, text:'第一步延迟2s' }, { delay:3000, text:'第二步延迟3s' }, { delay:1000, text:'第三步延迟1s' }, ],cb=(text)=>{ console.log('渲染回调&......