CF1677E Tokitsukaze and Beautiful Subsegments

好题。

对于区间最大值,考虑单调栈维护,记一个数 aia_iai​ 左右边第一个比他大的数分别为 LiL_iLi​ 和 RiR_iRi​。

则对于区间 [l,r][l,r][l,r] 满足 Li<l≤r<RiL_i<l\leq r<R_iLi​<l≤r<Ri​,有 max⁡k=lrak=ai\max_{k=l}^{r}a_k=a_imaxk=lr​ak​=ai​。

对于每个 aia_iai​,我们可以尝试确定区间左端点范围 [L,R][L,R][L,R],初始 L=Li+1L=L_i+1L=Li​+1,R=LiR=L_iR=Li​。

接着,枚举 aia_iai​ 的因数 x,yx,yx,y,判断是否 Li<posx,posy≤iL_i<pos_x,pos_y \leq iLi​<posx​,posy​≤i,即在范围内,然后更新 R=min⁡(posx,posy)R=\min(pos_x,pos_y)R=min(posx​,posy​),总时间复杂度 O(∑ai)\mathcal O(\sum\sqrt{a_i})O(∑ai​​)。

然后枚举区间右端点,算出与它乘积为 aia_iai​ 的数的位置,判断是否在范围内,更新 RRR,记录。

这样就记录下了 (L,R,r)(L,R,r)(L,R,r),表示右端点为 rrr,左端点为 [L,R][L,R][L,R] 的区间是美丽的。

考虑扫描线,将询问离线,右端点升序,把右端点为 iii 的所有三元组加入线段树,即区间加 111。

时间复杂度 O(n2log⁡n)\mathcal O(n^2\log n)O(n2logn)。

考虑优化,每次枚举 [i,Ri][i,R_i][i,Ri​] 和 [Li,i][L_i,i][Li​,i] 中长度小的,记录三元组,这样时间复杂度均摊 O(nlog⁡2n)\mathcal O(n\log^2n)O(nlog2n)。

#include<bits/stdc++.h>using namespace std;#define int long long
typedef long long ll;#define ha putchar(' ')
#define he putchar('\n')inline int read() {int x = 0, f = 1;char c = getchar();while (c < '0' || c > '9') {if (c == '-')f = -1;c = getchar();}while (c >= '0' && c <= '9')x = (x << 3) + (x << 1) + (c ^ 48), c = getchar();return x * f;
}inline void write(ll x) {if (x < 0) {putchar('-');x = -x;}if (x > 9)write(x / 10);putchar(x % 10 + 48);
}const int _ = 1e6 + 10;int n, q, s[_], t, a[_], pos[_], L[_], R[_], sz[_ << 2], tag[_ << 2], tr[_ << 2], as[_];struct abc {int l, r, id;
} qr[_];bool cmp(abc a, abc b) {return a.r < b.r;
}bool cmp2(abc a, abc b) {return a.l > b.l;
}vector<pair<int, int>> d[_], d2[_];void build(int o, int l, int r) {sz[o] = (r - l + 1), tr[o] = tag[o] = 0;if (l == r) return;int mid = (l + r) >> 1;build(o << 1, l, mid), build(o << 1 | 1, mid + 1, r);
}void pushdown(int o) {if (tag[o]) {tr[o << 1] += sz[o << 1] * tag[o];tr[o << 1 | 1] += sz[o << 1 | 1] * tag[o];tag[o << 1] += tag[o];tag[o << 1 | 1] += tag[o];tag[o] = 0;}
}void upd(int o, int l, int r, int L, int R, int k) {if (L <= l && r <= R) {tr[o] += sz[o] * k, tag[o] += k;return;}pushdown(o);int mid = (l + r) >> 1;if (L <= mid) upd(o << 1, l, mid, L, R, k);if (R > mid) upd(o << 1 | 1, mid + 1, r, L, R, k);tr[o] = tr[o << 1] + tr[o << 1 | 1];
}int qry(int o, int l, int r, int L, int R) {if (L <= l && r <= R) return tr[o];pushdown(o);int mid = (l + r) >> 1, res = 0;if (L <= mid) res = qry(o << 1, l, mid, L, R);if (R > mid) res += qry(o << 1 | 1, mid + 1, r, L, R);tr[o] = tr[o << 1] + tr[o << 1 | 1];return res;
}signed main() {n = read(), q = read();for (int i = 1; i <= n; ++i) a[i] = read(), pos[a[i]] = i;t = 0;for (int i = 1; i <= n; ++i) {while (t > 0 && a[s[t]] < a[i]) t--;L[i] = s[t];s[++t] = i;}t = 0, s[0] = n + 1;for (int i = n; i >= 1; --i) {while (t > 0 && a[s[t]] < a[i]) t--;R[i] = s[t];s[++t] = i;}for (int i = 1; i <= q; ++i)qr[i].l = read(), qr[i].r = read(), qr[i].id = i;for (int i = 1; i <= n; ++i) {int l, r;if (R[i] - i <= i - L[i]) {r = L[i];for (int j = 1; j * j <= a[i]; ++j) {if (a[i] % j != 0) continue;int fx = pos[j], fy = pos[a[i] / j];if (fx == fy) continue;if (fx > fy) swap(fx, fy);if (fx > L[i] && fy <= i) r = max(r, fx);}for (int j = i; j < R[i]; ++j) {if (a[i] % a[j] == 0) {int nw = a[i] / a[j];if (pos[nw] == j) continue;if (pos[nw] > L[i] && pos[nw] < j) {r = max(r, pos[nw]);r = min(r, i);}}if (L[i] < r) d[j].push_back({L[i] + 1, r});}} else {l = R[i];for (int j = 1; j * j <= a[i]; ++j) {if (a[i] % j != 0) continue;int fx = pos[j], fy = pos[a[i] / j];if (fx == fy) continue;if (fx > fy) swap(fx, fy);if (fy < R[i] && fx >= i) l = min(l, fy);}for (int j = i; j > L[i]; --j) {if (a[i] % a[j] == 0) {int nw = a[i] / a[j];if (pos[nw] == j) continue;if (pos[nw] > j && pos[nw] < R[i]) {l = min(l, pos[nw]);l = max(l, i);}}if (l < R[i]) d2[j].push_back({l, R[i] - 1});}}}sort(qr + 1, qr + q + 1, cmp);build(1, 1, n);int k = 1;for (int i = 1; i <= n; ++i) {for (auto v : d[i]) upd(1, 1, n, v.first, v.second, 1);for (; qr[k].r == i && k <= q; ++k)as[qr[k].id] += qry(1, 1, n, qr[k].l, qr[k].r);}sort(qr + 1, qr + q + 1, cmp2);build(1, 1, n);k = 1;for (int i = n; i >= 1; --i) {for (auto v : d2[i]) upd(1, 1, n, v.first, v.second, 1);for (; qr[k].l == i && k <= q; ++k)as[qr[k].id] += qry(1, 1, n, qr[k].l, qr[k].r);}for (int i = 1; i <= q; ++i) write(as[i]), he;return 0;
}

CF1677E Tokitsukaze and Beautiful Subsegments相关推荐

  1. Tokitsukaze and Good 01-String (easy version)

    Tokitsukaze and Good 01-String (easy version) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 This is the easy ...

  2. Python Beautiful Soup类的基本元素

    Beautiful Soup库是解析,遍历,维护"标签树"的功能库. 条件: pip install lxml pip install html5lib 以下5种基本元素是使用方法 ...

  3. Python爬虫利器之Beautiful Soup的全世界最强用法 五百行文章!

    0. 前言 爬虫是一个非常有意思的东西,比如自己做的一个网页上面什么数据都没有就可以爬虫别人的 然后进行去重 数据分析等等 在这里因为爬虫涉及到的方面非常多 1. Beautiful Soup的简介 ...

  4. Codeforces Round #181 (Div. 2) C. Beautiful Numbers 排列组合 暴力

    C. Beautiful Numbers 题目连接: http://www.codeforces.com/contest/300/problem/C Description Vitaly is a v ...

  5. CodeForces - 55D Beautiful numbers

    题目链接:http://codeforces.com/problemset/problem/55/D 题意:求区间[L,R]有多少个Beautiful numbers.Beautiful number ...

  6. 第十四届华中科技大学程序设计竞赛 B Beautiful Trees Cutting【组合数学/费马小定理求逆元/快速幂】...

    链接:https://www.nowcoder.com/acm/contest/106/B 来源:牛客网题目描述 It's universally acknowledged that there're ...

  7. python爬虫beautifulsoup实例-Python爬虫学习(二)使用Beautiful Soup库

    (一)使用Beautiful Soup库(默认将HTML转换为utf-8编码) 1,安装Beautiful Soup库:pip install beautifulsoup4 2,简单使用: impor ...

  8. python利器怎么用-Python爬虫利器二之Beautiful Soup的用法

    The Dormouse's story Once upon a time there were three little sisters; and their names were , Lacie ...

  9. 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)

    链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...

最新文章

  1. 人工智能的学习,需要学习哪些算法和数学知识呢?需要什么学历?
  2. Windows Phone DataBound ListBox中针对UIElement的事件绑定(Button)
  3. 一张图看明白Git的四个区五种状态
  4. Windows Server 2008 没有磁盘清理工具的情况下使用系统提供的磁盘清理工具
  5. swift-UITextfield控件的基本属性设置
  6. idea+spring boot+jrebel7.0.14热启动
  7. 第1章 Spring Cloud 构建微服务架构(一)服务注册与发现
  8. 关于计算机的知识古人,世界仅是一串二进制编码?我们是虚拟的?古人早就给出了答案...
  9. python桌面程序臃肿_为Python应用构建最精简Docker
  10. atitit.web ui 结构建模工具总结
  11. c#Struts框架理念和自制Struts框架下 复杂版(2009-06-10)
  12. 产品经理学习——卡诺模型
  13. python数字时钟
  14. Could NOT find Vulkan (missing: Vulkan_LIBRARY Vulkan_INCLUDE_DIR) | 解压安装
  15. 开源框架XWIKI搭建介绍
  16. Thymeleaf 是个什么?
  17. Android Multimedia Framework overview(多媒体框架概述)--base on jellybean(一)
  18. Redis监听失效的字段
  19. Pytorch学习之cuda
  20. 经验谈系列 我们应该怎么给父母配电脑

热门文章

  1. Java基础系列28-常用api之包装类
  2. Java新手入门200例122之通过Java反射操作成员变量,set 和 get
  3. easyx的基础应用教程
  4. 取小数点后两位(解析)
  5. css好看的html径向渐变,CSS3径向渐变
  6. 90% 的前端都会使用 ES6 来简化代码,你都用过哪些?
  7. 程序员的12条经营分享
  8. uniCloud使用
  9. 关于网络上的刷钻方法
  10. 简悦保存notion一直显示请稍后重试