首页 > 其他分享 >P10764 [BalticOI 2024] Wall

P10764 [BalticOI 2024] Wall

时间:2024-11-05 21:22:04浏览次数:3  
标签:return P10764 rs Wall 2024 int ls inline mod

更好的阅读体验

首先可以枚举一个位置的水量 \(w\),求 \(c_{w}\) 表示其方案数,答案为 \(\sum c_{w}\)。那么可以设 \(c_{i,j}\) 表示位置 \(i\) 水量 \(\ge j\) 的方案数,答案为 \(\sum c_{i,j}\)。一个位置 \(i\),墙高为 \(a_i\),要求其有至少 \(j\) 单位的水,那么左右的 \(\max h\) 必然都要 \(\ge a_i+j\)。考虑容斥,分别求出左边 \(\max h <a_{i}+j\),右边 \(\max h<a_{i}+j\) 和左右两边的 \(\max h<a_{i}+j\) 的方案数。

考虑一个位置对方案数的贡献,不妨设 \(a_{k}<b_{k},h=a_{i}+j\),若 \(h>b_{k}\),那么贡献为 \(\times 2\),若 \(a_k<h\le b_k\),那么贡献为 \(\times 1\),若 \(h\le a_k\),那么贡献为 \(\times 0\)。以单独求左边条件的方案数为例,我们从左到右扫描线,在维护时只需要维护后缀 \(\times 2\),记录前缀 \(\times 0\) 的最大限制即可,查询就查询后缀和。

对于两边都有限制的情况,每次就是消除 \(i\) 的限制。不妨先考虑所有限制,用线段树维护,扫描到 \(i\) 的时候撤销 \(i\) 的限制即可。

#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int N = 5e5 + 5, M = 40, mod = 1e9 + 7, inf = 1e9;

inline void add(int & x, int y) {x += y; if (x >= mod) x -= mod;}
inline void dec(int & x, int y) {x += mod - y; if (x >= mod) x -= mod;}
inline int pls(int x, int y) {x += y; if (x >= mod) x -= mod; return x;}
inline int sub(int x, int y) {x += mod - y; if (x >= mod) x -= mod; return x;}
inline int mul(int x, int y) {return 1ll * x * y % mod;}

int n, a[N], b[N], ans, rt, _2[N], iv, pl[N], sl[N];

namespace smt {
  int ls[N * M], rs[N * M], s[N * M], tag[N * M], cnt;
#define ls(p) ls[p]
#define rs(p) rs[p]

  inline void init() {for (int i = 1; i <= cnt; ++i) ls[i] = rs[i] = s[i] = tag[i] = 0; cnt = rt = 0;}

  inline int nnd(int len) {return cnt++, s[cnt] = len, tag[cnt] = 1, cnt;}

  inline void work(int k, int p) {tag[p] = mul(tag[p], k), s[p] = mul(s[p], k);}

  inline void psd(int l, int r, int p) {
    int mid = (l + r) >> 1;
    if (!ls(p)) ls(p) = nnd(mid - l + 1);
    if (tag[p] ^ 1) work(tag[p], ls(p));
    if (!rs(p)) rs(p) = nnd(r - mid);
    if (tag[p] ^ 1) work(tag[p], rs(p));
    tag[p] = 1;
  }

  inline void psu(int p) {s[p] = pls(s[ls(p)], s[rs(p)]);}

  inline void ad(int l, int r, int L, int R, int k, int & p) {
    if (L > R) return;
    if (!p) p = nnd(r - l + 1);
    if (l >= L && r <= R) return work(k, p);
    int mid = (l + r) >> 1; psd(l, r, p);
    if (L <= mid) ad(l, mid, L, R, k, ls(p));
    if (R > mid) ad(mid + 1, r, L, R, k, rs(p));
    psu(p);
  }

  inline int ask(int l, int r, int L, int R, int p) {
    if (L > R) return 0;
    if (!p) return max(0, min(r, R) - max(l, L) + 1);
    if (l >= L && r <= R) return s[p];
    int mid = (l + r) >> 1, ans = 0; psd(l, r, p);
    if (L <= mid) add(ans, ask(l, mid, L, R, ls(p)));
    if (R > mid) add(ans, ask(mid + 1, r, L, R, rs(p)));
    return ans;
  }
}

using namespace smt;

inline int qpow(int a, int b) {
  int s = 1;
  while (b) {
    if (b & 1) s = mul(s, a);
    a = mul(a, a), b >>= 1;
  } return s;
}

signed main() {
  cin >> n;
  for (int i = 1; i <= n; ++i) cin >> a[i];
  for (int i = 1; i <= n; ++i) cin >> b[i];
  _2[0] = 1; for (int i = 1; i <= n; ++i) _2[i] = mul(_2[i - 1], 2);
  iv = qpow(2, mod - 2);
  init();
  for (int i = 1; i <= n; ++i) {
    add(ans, mul(inf - a[i], qpow(2, n - 1)));
    add(ans, mul(inf - b[i], qpow(2, n - 1)));
  }
  for (int i = 1, lm = 0; i <= n; ++i) {
    int t = ask(1, inf, max(lm + 1, a[i] + 1), inf, rt);
    dec(ans, mul(t, _2[n - i]));
    t = ask(1, inf, max(lm + 1, b[i] + 1), inf, rt);
    dec(ans, mul(t, _2[n - i]));
    ad(1, inf, max(a[i], b[i]) + 1, inf, 2, rt), lm = max(lm, min(a[i], b[i]));
    pl[i] = lm;
  }
  init();
  for (int i = n, lm = 0; i; --i) {
    int t = ask(1, inf, max(lm + 1, a[i] + 1), inf, rt);
    dec(ans, mul(t, _2[i - 1]));
    t = ask(1, inf, max(lm + 1, b[i] + 1), inf, rt);
    dec(ans, mul(t, _2[i - 1]));
    ad(1, inf, max(a[i], b[i]) + 1, inf, 2, rt), lm = max(lm, min(a[i], b[i]));
    sl[i] = lm;
  }
  init();
  for (int i = 1; i <= n; ++i) ad(1, inf, max(a[i], b[i]) + 1, inf, 2, rt);
  for (int i = 1; i <= n; ++i) {
    ad(1, inf, max(a[i], b[i]) + 1, inf, iv, rt);
    add(ans, ask(1, inf, max(max(pl[i - 1], sl[i + 1]), a[i]) + 1, inf, rt));
    add(ans, ask(1, inf, max(max(pl[i - 1], sl[i + 1]), b[i]) + 1, inf, rt));
    ad(1, inf, max(a[i], b[i]) + 1, inf, 2, rt);
  }
  cout << ans << endl;
  return 0;
}

标签:return,P10764,rs,Wall,2024,int,ls,inline,mod
From: https://www.cnblogs.com/Tagaki-san/p/18528879

相关文章

  • CSP2024 前集训:NOIP2024加赛 1
    前言赛时本来rk3,赛后自己加hack卡自己于是成rk4了。因为这场是假做法大战,T1假贪心有\(92pts\);T2\(O(n^2m)\)能过(是因为数据里\(m\le10\));T3相当抽象,赛时我打的爆搜只加了一个剪枝能得\(70pts\),赛后发现无解的时候会跑满,于是提前判掉无解就过了甚至最优解\(30ms\)......
  • 2024年深受用户喜爱的桌面工作安排软件——6款工具精选
    一、引言在当今数字化办公时代,桌面工作安排软件已成为提升工作效率和组织管理能力的关键工具。该类软件通过集成日历、任务管理和项目管理功能,为用户提供了一个清晰、有序的工作规划平台,使得日常工作中的复杂性和不确定性得以有效转化和管理。它们的核心价值在于,能够协助用户......
  • HTC Vive SDK:空间定位与追踪技术教程_2024-07-26_09-12-46.Tex
    HTCViveSDK:空间定位与追踪技术教程HTCViveSDK概览HTCViveSDK(SoftwareDevelopmentKit)是为开发者提供的一套工具和API,用于创建与HTCVive虚拟现实头盔兼容的应用程序。该SDK的核心功能之一是空间定位与追踪技术,它允许开发者在虚拟环境中精确地追踪用户的头部和手部......
  • 2024年备受推荐的数据可视化平台——团队管理必备利器
    一、引言在当今数字化飞速发展的时代,数据已经成为企业和团队决策、管理以及运营的核心要素之一。然而,原始的数据往往是繁杂且晦涩难懂的,呈现为海量的数字、文本等形式,单纯依靠人工去解读和分析这些数据不仅效率低下,而且很难从中快速准确地提取出有价值的信息。这时候,数据可视......
  • HTC Vive SDK:手柄控制与输入技术教程_2024-07-26_09-21-37.Tex
    HTCViveSDK:手柄控制与输入技术教程HTCViveSDK概览SDK下载与安装在开始开发HTCVive虚拟现实应用之前,首先需要下载并安装HTCVive的SDK。以下是详细的步骤:访问官网:打开HTCVive的官方网站,找到开发者中心。下载SDK:在开发者中心页面,找到并下载适用于你操作系统的......
  • HTC Vive SDK:性能优化与测试技术教程_2024-07-26_09-39-02.Tex
    HTCViveSDK:性能优化与测试技术教程HTCViveSDK概览SDK主要组件介绍在开发HTCVive虚拟现实应用时,SDK(SoftwareDevelopmentKit)是不可或缺的工具包,它包含了创建高性能VR体验所需的各种组件和库。HTCViveSDK的核心组件包括:1.OpenVROpenVR是Valve开发的开源VR平台......
  • 2024.11.5 鲜花
    放点屁话大家多交hack。有的人觉得没意义,这也无可厚非,有的人怕被骂,我一直认为这是多余的,但竟然真的有人骂?这是无法理解的,所以发文声讨一下。叠甲:本文仅代表个人观点,可能有过激言论,不针对任何人。不是你们骂交hack的人是什么心态啊。你站在道德制高点上,谴责人家交hack,你首......
  • 2024.11.5 闲话
    别人的闲话都推图or歌,我的鲜花啥也没有。我也没啥可推的啊,求图or歌高维前缀和常见的柿子是\(s_{i,j}=s_{i-1,j}+s_{i,j-1}-s_{i-1,j-1}+a_{i,j}\)。但是还可以一维一维求。点此查看代码rep(i,1,n,1)rep(j,1,m,1)a[i][j]+=a[i-1][j];rep(i,1,n,1)rep(j,1,m,1)a[i]......
  • 多校A层冲刺NOIP2024模拟赛18
    多校A层冲刺NOIP2024模拟赛18\(T1\)A.选彩笔(rgb)\(100pts/100pts\)观察到\(0\ler,g,b\le255\)且答案具有单调性,故考虑二分答案。将\(r,g,b\)分别抽象成三维坐标下的\(x,y,z\)。设当前二分出的答案为\(mid\),由调整法分析可知若存在一个边长为\(mid\)的......
  • 2024年教育、管理与艺术文化国际学术会议 (EMAC 2024) 2024 International Conference
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus三、大会介绍2024年教育、管理与艺术文化国际学术会议(EMAC2024)将于2024年12月20-22日在中国-......