首页 > 其他分享 >CF1316F sol

CF1316F sol

时间:2024-09-04 19:48:27浏览次数:6  
标签:frac val limits int sum mid sol CF1316F

简化题意

传送门

定义一个长度为\(n\)的权值\(val(p) = \sum \limits_{i=1}^{n-1}p^{'}_ip^{'}_{i+1}\),其中\(p^{'}\)为\(p\)排序后的序列。特殊的,如果\(n\le 1\),\(val(p)=\text{0}\)

现在给定长度为\(n\)一个序列\(a\),\(a\)的所有子序列\(a^{'}\)的\(val(a^{'})\)的\(\text{sum}\)

hint

复杂度

\(O(qn^2) \to O(qn) \to \text{无修改} \to O(q \text{log}\ n)\)

做法的提示

考虑分治数据结构,信息合并可以\(\mathcal{O}(1)\)

做法

最暴力的做法

考虑到排列顺序其实不会影响答案,所以我们忽略,考虑离散化。我们令排序后的序列为\(p\),点对\((i, j)\)能对答案产生贡献的概率为\(\frac{1}{2 ^ {j - i + 1}}\),所以可以列出答案式子:

\[ans = \sum \limits_{i = 1}^{n} \sum \limits_{j = i + 1}^{n} \frac{p_ip_j}{2^{j-i+1}} \]

对于每一次的更改直接考虑重新计算一边答案就行了

从式子层面进行优化

上面提到要考虑分治,于是考虑分治。由于左区间和右区间一定没有交点,因此我们可以考虑拆开贡献。显然的,贡献能够分成三部分:

  1. \(i, j\)都在左区间
  2. \(i, j\)都在右区间
  3. \(i\)在左区间,\(j\)在右区间(钦定\(i < j\))

容易对第三种情况列出式子:

\(\Large \sum \limits_{i = l}^{mid} \sum \limits_{j = mid + 1}^{r} \frac{p_ip_j}{2 ^ {j - i + 1}}\)

= \(\Large \sum \limits_{i = l}^{mid} \sum \limits_{j = mid + 1}^{r} \frac{p_ip_j}{2 ^ {mid - i + 1} \times 2 ^ {r - mid}}\)

= \(\Large \sum \limits_{i = l}^{mid} \sum \limits_{j = mid + 1}^{r} \frac{p_i}{2 ^ {mid - i + 1}} \frac{p_j}{2 ^ {r - mid}}\)

把sigma拆开,变成\(\Large (\sum \limits_{i = l}^{mid}\frac{p_i}{2^{mid - i + 1}})(\sum \limits_{i = mid+1}^{r}\frac{p_i}{2^{r - mid}})\)

于是想到把这三个东西进行维护。我们令

\[\left\{\begin{matrix} f(l, r) = \sum \limits_{i = l}^{mid} \sum \limits_{j = mid + 1}^{r} \frac{p_ip_j}{2 ^ {j - i + 1}} \\ g(l, r) = \sum \limits_{i = l}^{r}\frac{p_i}{2^{r - i + 1}} \\ h(l, r) = \sum \limits_{i = l}^{r}\frac{p_i}{2^{r - i + 1}} \end{matrix}\right. \]

然后可以发现

\[ \left\{\begin{matrix} f(l, r) = f(l, mid) + f(mid + 1, r) + h(l, mid)g(mid + 1, r) \\ g(l, r) = g(l, mid) + \frac{g(mid + 1, r)}{2 ^ {mid - l + 1}} \\ h(l, r) = \frac{h(l, mid)}{2 ^ {r - mid}} + h(mid + 1, r) \end{matrix}\right. \]

且最终答案为\(f(1, n)\)。

于是直接对于每一次询问我们重新运算就行了,这是\(\mathcal{O}(qn)\)的》

正解

我们可以非常容易的发现很大一部分是重复计算的,于是我们就考虑用数据结构维护。注意,在离散化的时候不要unique,将同一个数留下不同的编号,然后扔到线段树里面维护就行了。这种做法是\(O(n + q\text{log}\ n) + O(n + q)\)的,可以通过此题。

code

using mint = georgeyucjr::modint1000000007;
constexpr int N = 3e5 + 5;
 
int n, q, a[N], p[N], b[N * 2], val[N];
unordered_map<int, int> cnt;
mint ipw2[N];
mint Iv2 = mint(2).inv();
 
struct Node {
  int len;
  mint ans, lv, rv;
} seg[N << 3];
 
Node operator+(const Node&x, const Node&y) {
  Node res;
  res.len = x.len + y.len;
  res.lv = x.lv + y.lv * ipw2[x.len];
  res.rv = x.rv * ipw2[y.len] + y.rv;
  res.ans = x.ans + y.ans + x.rv * y.lv;
  return res;
}
 
void pushup(int index) {
  seg[index] = seg[lson] + seg[rson];
}
 
void build(int index, int l, int r) {
  if (l == r) return ;
  int mid = (l + r) >> 1;
  build(lson, l, mid);
  build(rson, mid + 1, r);
  pushup(index);
}
 
void change(int index, int l, int r, int qpos, int t) {
  if (l == r) {
    assert(l == qpos);
    seg[index].ans = 0;
    if (t > 0) {
      ++seg[index].len;
    } else {
      --seg[index].len;
    }
    seg[index].lv += t * Iv2;
    seg[index].rv += t * Iv2;
    return ;
  } int mid = (l + r) >> 1; 
  if (qpos <= mid)
    change(lson, l, mid, qpos, t); 
  else if (qpos > mid)
    change(rson, mid + 1, r, qpos, t);
  else assert(false);
  pushup(index);
}
 
signed main() {
  ipw2[0] = 1, ipw2[1] = Iv2;
  rep(i, 2, N - 5) ipw2[i] = ipw2[i - 1] * Iv2;
  read(n);
  rep(i, 1, n) read(a[i]), b[i] = a[i];
  read(q);
  rep(i, 1, q, pos, v) {
    read(pos, v);
    b[i + n] = v;
    p[i] = pos;
    val[i] = v;
  }
  // 注意不要习惯加unique了,要将同value的不同的数给区分开
  sort(b + 1, b + n + q + 1);
  rep(i, 1, n) 
    a[i] = lower_bound(b + 1, b + n + q + 1, a[i]) - b + (++cnt[a[i]]) - 1;
  rep(i, 1, q)
    val[i] = lower_bound(b + 1, b + n + q + 1, val[i]) - b + (++cnt[val[i]]) - 1;
  rep(i, 1, n) 
    change(1, 1, n + q, a[i], b[a[i]]);
  writeln(seg[1].ans.val());
  rep(i, 1, q) {
    change(1, 1, n + q, a[p[i]], -b[a[p[i]]]);
    change(1, 1, n + q, a[p[i]] = val[i], b[val[i]]);
    writeln(seg[1].ans.val());
  }
 
#if defined(LOCAL) && !defined(CPH)
  std::cerr << "Spend Time : " << clock() * 1. / CLOCKS_PER_SEC * 1e3 << " ms \n";
#endif
  return flush(), 0;
}

完整代码在code

标签:frac,val,limits,int,sum,mid,sol,CF1316F
From: https://www.cnblogs.com/georgeyucjr/p/18397115

相关文章

  • Comsol 三维结构声子晶体禁带及其传输特性
    1.带隙结构:声子晶体的带隙结构描述了声子在材料中传播的允许和禁止频率范围。它以色散关系的形式表示,显示了声子频率与晶体中的波矢之间的关系。2.声子禁带:声子禁带是带隙结构中的一个频率范围,在这个范围内声子被禁止在晶体中传播。它是由于晶体结构的周期性排列导致的声......
  • BISM7255 UML VendWise Solutions Vending Machines
    UML Assignment–Semester2,2024BISM7255AdigitalsolutionforVendWiseSolutionsVending MachinesAssignmentOverviewAssessmentWeight:40%IndividualorGroupwork:Either–yourchoiceMaximumgroupsize:2Due Date:13......
  • SolarMarker 正在使用水坑攻击与伪造的 Chrome 浏览器更新进行攻击
     在过去的三个月里,eSentire的安全研究团队发现信息窃密恶意软件SolarMarker都没有发动攻击,却在最近忽然重返舞台。此前,SolarMarker的运营者使用SEO投毒或者垃圾邮件来引诱受害者,受害者试图下载一些文档的免费模板,就被攻击者盯上了。最新的攻击中,攻击者开始利用伪造的Ch......
  • SolarMarker 正在使用水坑攻击与伪造的 Chrome 浏览器更新进行攻击
     在过去的三个月里,eSentire的安全研究团队发现信息窃密恶意软件SolarMarker都没有发动攻击,却在最近忽然重返舞台。此前,SolarMarker的运营者使用SEO投毒或者垃圾邮件来引诱受害者,受害者试图下载一些文档的免费模板,就被攻击者盯上了。最新的攻击中,攻击者开始利用伪造的Ch......
  • javascript中console类有哪些功能,主要用于调试和输出信息
     ‌输出普通信息‌:使用console.log()方法可以输出字符串、数字、对象等普通信息。此外,还可以使用占位符(如%s、%d、%f等)来格式化输出内容。‌输出错误信息‌:console.error()方法用于输出错误信息,通常以红色显示,便于快速识别问题。‌输出警告信息‌:console.warn()方法用于输出......
  • 【题解】Solution Set - 「蓝」题板刷
    【题解】SolutionSet-「蓝」题板刷始于:2024/9/1(其实之前大概做了十来道,但是没有记录。估计题会比较多,如果从代码里面过来的话,建议直接Ctrl/⌘+F题目名称。「USACO18JAN」MooTubeG2024/9/1一句话题意:https://www.luogu.com/discuss/125319给定一棵有边权的树,每次询......
  • Paper Reading: Multi-class imbalance problem: A multi-objective solution
    目录研究动机文章贡献本文方法问题定义多分类多目标选择集成框架多类样本的客观建模理论分析实验结果数据集和实验设置对比实验结果运行时间优化边界的有效性优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力所限,可能有理解不到位的地方。具......
  • Lecture 14 A Glimpse of Industrial Solutions
    Lecture14AGlimpseofIndustrialSolutionsTemporalAnti-Aliasing(TAA)为什么有aliasing光栅化期间SPP不足(样本数量不足)终极解决方案是用更多的样本(MSAA)TemporalAnti-Aliasing跨越实际贡献/复用采样思路和在RTRT中如何利用temporal的信息一模一样思路......
  • 【题解】Solution Set - NOIP2024模拟赛4
    【题解】SolutionSet-NOIP2024模拟赛4https://www.becoder.com.cn/contest/5501T2沉默乐团https://www.becoder.com.cn/submission/2593352T3深黯「军团」记录一下考场思路:首先对于长度为\(n\)所有排列,按顺序求出她的逆序对数量。然后找到了规律。后面基于此,写出......
  • DaVinci Resolve Studio 19.0 正式版 (macOS, Windows) - 剪辑、调色、特效和音频后期
    DaVinciResolveStudio19.0正式版(macOS,Windows)-剪辑、调色、特效和音频后期制作BlackmagicDesignDaVinciResolveStudio请访问原文链接:https://sysin.org/blog/davinci-resolve/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgDaVinciResolve19免费!......