首页 > 其他分享 >P3793 由乃救爷爷

P3793 由乃救爷爷

时间:2024-08-23 17:53:04浏览次数:2  
标签:由乃救 le lc int unsigned 爷爷 z4 z1 P3793

题意

给定一个长度为 \(n\) 的序列(\(1 \le n \le 2 \times 10 ^ 7\)),对于每组询问 \([l, r]\),找到其区间最大值,并进行累加。

思路

\(n\) 太大,不能用 ST 表/线段树,考虑以下表为键值,数值为优先级建出笛卡尔树。

对于左右两个端点 \([l, r]\),我们从笛卡尔树顶端往下跑,找到一个 \(l \le x \le r\) 的点 \(x\),输出其对应的结果即可。

代码

#include <bits/stdc++.h>

using namespace std;
using ull = unsigned long long;

const int N = 20000010;

int lc[N], rc[N], stk[N], top;
int n, m, s, a[N];

//Problem Statement

namespace GenHelper
{
    unsigned z1,z2,z3,z4,b;
    unsigned rand_()
    {
    b=((z1<<6)^z1)>>13;
    z1=((z1&4294967294U)<<18)^b;
    b=((z2<<2)^z2)>>27;
    z2=((z2&4294967288U)<<2)^b;
    b=((z3<<13)^z3)>>21;
    z3=((z3&4294967280U)<<7)^b;
    b=((z4<<3)^z4)>>12;
    z4=((z4&4294967168U)<<13)^b;
    return (z1^z2^z3^z4);
    }
}
void srand(unsigned x)
{using namespace GenHelper;
z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51;}
int read()
{
    using namespace GenHelper;
    int a=rand_()&32767;
    int b=rand_()&32767;
    return a*32768+b;
}

// Problem Statement(end)

int main() {
    cin >> n >> m >> s;
    srand(s);
    for (int i = 1; i <= n; i++) a[i] = read();

    for (int i = 1; i <= n; i++) {
        int k = top;
        while (k && a[stk[k]] < a[i]) k--;
        if (k) rc[stk[k]] = i;
        if (k < top) lc[i] = stk[k + 1];
        stk[++k] = i;
        top = k;
    }

    int rt = stk[1];

    ull ans = 0;
    while (m--) {
        int l = read() % n + 1, r = read() % n + 1;
        if (l > r) swap(l, r);
        int x = rt;
        int res = 0;
        while (true) {
            if (x >= l && x <= r) {
                res = a[x];
                break;
            }
            if (x < l) {
                if (rc[x]) x = rc[x];
                else break;
            }
            if (x > r) {
                if (lc[x]) x = lc[x];
                else break;
            }
        }
        ans += res;
    }
    cout << ans << '\n';
    return 0;
}

标签:由乃救,le,lc,int,unsigned,爷爷,z4,z1,P3793
From: https://www.cnblogs.com/Yuan-Jiawei/p/18376718

相关文章

  • 爷爷奶奶每年的酸奶牛奶和人参
    牛奶是7.9一瓶 一年是2,883.5酸奶是4元一瓶,5-15-5.30、9.1-10.1每天需要1.5瓶  4元*45天*1.5=2706.1-8.30每天需要2瓶4*90*2=720 大约需要3,873元。每年5月5号有优惠券。记得去app领-----------------------------------------------人参买多多上万宝庭的,......
  • 【爷爷赶集给娃买裤子拿去学校让试穿】隔代亲的感情一直都很让人动容
    爷爷赶集给娃买裤子拿去学校让试穿12月29日,贵州遵义一位爷爷赶集给孙子买了条裤子,拿去学校让孙子试穿。据老师介绍,老人是怕裤子不合适, 爷爷赶集给娃买裤子怕不合适拿去学校让试穿 网友:好暖心的爷爷啊爷爷在集市上精心挑选,终于找到了一条他觉得孩子会喜欢的裤子。他拿着这......
  • vue中孙子调用爷爷组件的方法怎么调用?
    使用Vue的provide和inject来实现跨层级的组件通信。provide允许一个祖先组件(爷爷组件)提供数据,而inject允许子孙组件(孙子组件)在任意层级注入这个数据。通过这种方式,你可以在孙子组件中访问到爷爷组件提供的方法。以下是一个简单的例子://在爷爷组件中提供方法exportdefault......
  • 张雪峰:为啥学物流?我 爸干物流的,我妈干物流的,爷爷奶奶开镖局的! ​​​
    张雪峰:为啥学物流?我爸干物流的,我妈干物流的,爷爷奶奶开镖局的!​​​ 我乡村医生,我爸爸乡镇医生,我爷爷赤脚医生体温计、血压计、听诊器这“老三件”​​​ 我爸南阳师专的,我妈信阳师专的,我爷爷郑州师范学校的的。wo湖南师范大学的,你奶奶是不是河南师范学院的的​​​......
  • 我爸南阳师专的,我妈信阳师专的,我爷爷郑州师范学校的的。wo湖南师范大学的, 你奶奶是不
    我爸南阳师专的,我妈信阳师专的,我爷爷郑州师范学校的的。wo湖南师范大学的,你奶奶是不是河南师范学院的 我爸南阳师专的,我妈信阳师专的,我爷爷郑州师范学校的的。wo湖南师范大学的,你奶奶是不是河南师范学院的的经历一样哎我是专科南阳师范本科-商丘师范硕士信阳师范我是专......
  • 题解 洛谷 P3793 由乃救爷爷
    1.题面描述题目链接给定长为\(n\)的序列,\(m\)次询问,查询区间最大值。\(n,m\le10^7\),数据随机。2.分析经典的静态区间最小值问题,经典题目配经典算法,考虑到ST表......
  • 我的爷爷
        此篇献给一位至亲至爱的老人-我的爷爷,以一个孙子的口吻叙述我所知道爷爷近二十八年的生活经历。。。。。。    我们大家庭在一个叫园艺场(早些年叫张桥)的小村......