【枚举区间+线段树】CF Ehu 152 E

这篇具有很好参考价值的文章主要介绍了【枚举区间+线段树】CF Ehu 152 E。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Problem - E - Codeforces

题意:

【枚举区间+线段树】CF Ehu 152 E,枚举,线段树与树状数组,单调栈/单调队列,算法

思路:

感觉是个套路题

对区间计数,按照CF惯用套路,枚举其中一个端点,对另一个端点计数

对于这道题,枚举右端点,对左端点计数

【枚举区间+线段树】CF Ehu 152 E,枚举,线段树与树状数组,单调栈/单调队列,算法

Code:

#include <bits/stdc++.h>

#define int long long

using i64 = long long;

constexpr int N = 1e6 + 10;
constexpr int M = 1e6 + 10;
constexpr int P = 2600;
constexpr i64 Inf = 1e18;
constexpr int mod = 1e9 + 7;
constexpr double eps = 1e-6;

struct Segtree {
    int val, lazy;
}tr[N << 2];

int n;
int a[N];
int lmi[N], lmx[N];

void pushup(int rt) {
    tr[rt].val = tr[rt << 1].val + tr[rt << 1 | 1].val;
}
void build(int rt, int l, int r) {
    if (l == r) {
        tr[rt].val = 0;
        tr[rt].lazy = -1;
        return;
    }
    int mid = l + r >> 1;
    build(rt << 1, l, mid);
    build(rt << 1 | 1, mid + 1, r);
    pushup(rt);
}
void pushdown(int rt, int tot) {
        tr[rt << 1].lazy = tr[rt].lazy;
        tr[rt << 1 | 1].lazy = tr[rt].lazy;
        tr[rt << 1].val = (tot - tot / 2) * (tr[rt].lazy? 1 : 0);
        tr[rt << 1 | 1].val = (tot / 2) * (tr[rt].lazy? 1 : 0);
        tr[rt].lazy = -1;
}
void modify(int rt, int l, int r, int x, int y, int k) {
    if (x <= l && r <= y) {
        tr[rt].lazy = k;
        tr[rt].val = k * (r - l + 1);
        return;
    }
    if (tr[rt].lazy != -1) pushdown(rt, r - l + 1);
    int mid = l + r >> 1;
    if (x <= mid) modify(rt << 1, l, mid, x, y, k);
    if (y > mid) modify(rt << 1 | 1, mid + 1, r, x, y, k);
    pushup(rt);
}
void solve() {
    std::cin >> n;
    for (int i = 1; i <= n; i ++) {
        std::cin >> a[i];
    }

    std::stack<int> S, S2;
    for (int i = 1; i <= n; i ++) {
        while(!S.empty() && a[S.top()] >= a[i]) S.pop();
        lmi[i] = S.empty() ? 0 : S.top();
        S.push(i);
    }

    for (int i = 1; i <= n; i ++) {
        while(!S2.empty() && a[S2.top()] <= a[i]) S2.pop();
        lmx[i] = S2.empty() ? 0 : S2.top();
        S2.push(i);
    }

    build(1, 1, n);

    int ans = 0;
    for (int r = 1; r <= n; r ++) {
        if (lmi[r] + 1 <= r - 1) modify(1, 1, n, lmi[r] + 1, r - 1, 0);
        if (lmx[r] + 1 <= r - 1) modify(1, 1, n, lmx[r] + 1, r - 1, 1);
        ans += tr[1].val;
    }

    std::cout << ans << "\n";
}
signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int t = 1;

    while (t--) {
        solve();
    }
    
    return 0;
}

 文章来源地址https://www.toymoban.com/news/detail-688460.html

到了这里,关于【枚举区间+线段树】CF Ehu 152 E的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cf edu152 C. Binary String Copying(字符串双哈希)

    cf edu152 C. Binary String Copying(字符串双哈希) 题目链接:https://codeforces.com/contest/1849/problem/C 题目大意 给定一个01字符串,长度为n,拷贝m份,对每一份进行相应操作:将 [ L i , R i ] [L_i,R_i] [ L i ​ , R i ​ ] 的字符排序,实际就是调整为0在前1在后,问得到的m个副本有多少个不同

    2024年02月15日
    浏览(36)
  • 【*2200线段树Pushup】CF1567 E

    Problem - E - Codeforces 题意: 思路: 维护这些信息即可    Code:

    2024年02月16日
    浏览(29)
  • 线段树 区间赋值 + 区间加减 + 求区间最值

    线段树好题:P1253 扶苏的问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 区间赋值 + 区间加减 + 求区间最大。 对于区间赋值和区间加减来说,需要两个懒标记,一个表示赋值 cover ,一个表示加减 add 。 区间赋值的优先级大于区间加减。 对于区间赋值来说,需要将区间加减的

    2024年02月06日
    浏览(35)
  • 区间覆盖 & 线段覆盖 & 二分

    4195. 线段覆盖 - AcWing题库 P2082 区间覆盖(加强版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 做法: 差分解决区间覆盖:(这题不能过,但是感觉这个做法有用) 4195. 线段覆盖 - AcWing题库 问题描述: 坐标轴中共有多少个 整数坐标 的点满足恰好被 k条线段覆盖。 思路:离

    2024年02月12日
    浏览(40)
  • 贪心找性质+dp表示+矩阵表示+线段树维护:CF573D

    比较套路的题目 首先肯定贪心一波,两个都排序后尽量相连。我一开始猜最多跨1,但其实最多跨2,考虑3个人的情况: 我们发现第3个人没了,所以可以出现跨2的情况 然后直接上dp,由 i − 1 , i − 2 , i − 3 i-1,i-2,i-3 i − 1 , i − 2 , i − 3 转移过来。 然后这显然可以拿矩阵表

    2024年02月07日
    浏览(37)
  • 2023-07-26力扣每日一题-区间翻转线段树

    链接: 2569. 更新数组后处理求和查询 题意: 给两个等长数组nums1和nums2,三个操作: 操作1:将nums1的 [l,r] 翻转(0变1,1变0) 操作2:将 nums2[any] 变成 nums2[any]+nums1[any]*p ,p由操作给出,any表示数组里的每一位 操作3:查询nums2的和 解: 由于每次更新nums2的时候,不需要考虑

    2024年02月15日
    浏览(43)
  • 【图论经典题目讲解】CF786B - Legacy 一道线段树优化建图的经典题目

    D e s c r i p t i o n mathrm{Description} Description 给定 1 1 1 张 n n n 个点的有向图,初始没有边,接下来有 q q q 次操作,形式如下: 1 u v w 表示从 u u u 向 v v v 连接 1 1 1 条长度为 w w w 的有向边 2 u l r w 表示从 u u u 向 i i i ( i ∈ [ l , r ] iin [l,r] i ∈ [ l , r ] )连接 1 1 1 条长度为 w w w

    2024年02月20日
    浏览(89)
  • 【每日一题】补档 CF487B. Strip | 数据结构杂烩 -> 单调队列 | 困难

    原题链接 给定一个长度为 n n n 的数组,将这个数组进行拆分成若干个连续子数组, 使得每个子数组的最大值减去最小值小于等于 s s s , 且每个子数组的长度大于等于 l e n len l e n 。 问最少可以拆分成多少个连续子数组,如果不可以,则输出 − 1 -1 − 1 1 ≤ n , l e n ≤ 1 0

    2024年02月06日
    浏览(49)
  • 【*1900 图论+枚举思想】CF1328 E

    Problem - E - Codeforces 题意: 思路: 注意到题目的性质:满足条件的路径个数是极少的,因为每个点离路径的距离 =1 先考虑一条链,那么直接就选最深那个点作为端点即可 为什么,因为我们需要遍历所有点的父亲 推广到树,也是要遍历所有点的父亲 为什么要加枚举的tag,因为

    2024年02月14日
    浏览(41)
  • 【枚举+trie+dfs】CF514 C

    Problem - 514C - Codeforces 题意:   思路: 其实是trie上dfs的板题 先把字符串插入到字典树中 对于每次询问,都去字典树上dfs 注意到字符集只有3,因此如果发现有不同的字符,去枚举新的字符 Code:

    2024年02月14日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包