首页 > 其他分享 >[JSOI2008] 最大数 (单调栈)

[JSOI2008] 最大数 (单调栈)

时间:2024-10-02 10:12:35浏览次数:8  
标签:sub 最大数 Val int top JSOI2008 单调 size

算法

基础

发现插入总在最后一个进行

单调栈维护一个区间的 \(max / min\) 单调队列维护以一个值为 \(max / min\) 的最大区间

显然可以使用单调栈维护
其原理为

当 \(a, b \in seq, a < b, pos[a] < pos[b]\)
那么显然 \(a\) 没有卵用

因此可以用单调栈维护一个包含 \(seq\) 的最后一个元素的单调递减序列
求解区间 \([L, Last]\) 的值, 即为求解在 \([L, Last]\) 这一区间内第一个存在于单调栈中的元素

优化

二分 ( \(O(n\log n)\) )

显然可以二分查找
不加赘述

并查集 (\(O(n)\))

对于一个下标 \(i\) 将它和在它之后第一个在单调队列里的数的下标放在同一个并查集中
这样可以保证在插入的过程中仍然可以 \(O(1)\) 处理查询

#include <bits/stdc++.h>
const int MAXSIZE = 2e5 + 20;
#define int long long

int M, D;

class Union_Set
{
    private:

    public:
        int fa[MAXSIZE];

        int find(int Point)
        {
            return fa[Point] = (Point == fa[Point]) ? Point : find(fa[Point]);
        }

        void insert(int Fa, int Son)
        {
            fa[find(Son)] = find(Fa);
        }
} US;

struct node
{
    int Val;
    int sub;
};

class MonoStack
{
    private:

    public:
        node Val[MAXSIZE];
        int top;

        void init()
        {
            top = 0;
        }

        void insert(int x, int sub)
        {
            while (Val[top].Val < x && top)
            {
                US.insert(sub, Val[top].sub);
                top--;    
            }
            Val[++top].sub = sub;
            Val[top].Val = x;
        }

} MS;

int t = 0;
int size = 0;
int Num[MAXSIZE];

void solve()
{
    MS.init();
    while(M--)
    {
        char type;
        std::cin >> type;
        if(type == 'A')
        {
            scanf("%lld", &Num[++size]);
            Num[size] = (Num[size] + t) % D;
            US.fa[size] = size; 
            MS.insert(Num[size], size);
        }else{
            int L;
            scanf("%lld", &L);
            L = size - L + 1;
            t = Num[US.find(L)];
            printf("%lld\n", t);
        }
    }
}

signed main()
{
    scanf("%lld %lld", &M, &D);

    solve();

    return 0;
}

总结

代码

注意在单调栈弹出是确保位置有意义
并查集插入时需要初始化

思路

并查集往往可以用来处理连续的链向问题

标签:sub,最大数,Val,int,top,JSOI2008,单调,size
From: https://www.cnblogs.com/YzaCsp/p/18442961

相关文章

  • [JSOI2008] 最大数 (ST表)
    算法观察到插入都在末尾进行考虑逆向ST表代码#include<bits/stdc++.h>constintMAXSIZE=2e5+20;#defineintlonglongintTime,D;intt=0;/*反向st表方便处理末尾的插入*/classreverse_ST{private:intMax[MAXSIZE][20];public:......
  • 单调队列优化 DP
    单调队列可以\(O(n)\)求出子区间的最值,且顺序上要求区间的左端点和右端点单调不降。引入P1886滑动窗口/【模板】单调队列定义一个队列\(q\),我们让\(q\)中的元素满足单调不降。因此当\(x\)入队时,从前往后让不在当前范围的元素出队,从后往前将\(<x\)的元素全部出队,然......
  • [lnsyoj1015/luoguP1197/JSOI2008]星球大战starwar
    题意给出一个\(n\)个点,\(m\)条边的无向图,对其进行\(k\)次操作,每次操作会删除一个当前无向图中存在的点及其相邻的边,求原图和每次操作之后的图的连通块个数sol由于需要计算连通块个数,可以自然的想到使用并查集解决。然而,删除某个点后,我们无法通过并查集快速地得知其与其他......
  • 单调队列优化DP解题报告(uoj转)
    Fence\(K\)很小,考虑\(K\)开一维,\(N\)开一维\(f_{i,j}\)表示前\(i\)个工匠粉刷前\(j\)个木板的最大花费\(f_{i,j}=\min_{k=j-l_i}^{s_i-1}f_{i-1,k}+(j-k)\cdotp_i\)拆开为\(f_{i,j}=f_{i-1,k}-k\cdotp_i+j\cdotp_i\)\(i\)固定时维护\(f_{i-1,k}-k\cdotp_i\)的最小......
  • P4036 [JSOI2008] 火星人
    #include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intlen;intm;intrt=0;inthas[1000010];voidinit(){ srand(1);has[0]=1;for(inti=1;i<=1000000;i++)has[i]=has[i-1]*101;//cout<<......
  • 2024-09-14:用go语言,给定一个正整数数组 nums,定义一个加密函数 encrypt(x),其将一个整数
    2024-09-14:用go语言,给定一个正整数数组nums,定义一个加密函数encrypt(x),其将一个整数x的每一位数字都替换为x中的最大数字,然后返回加密后的数字。例如,encrypt(523)会返回555,encrypt(213)会返回333。现在需要计算数组中所有元素加密后的和,然后返回这个和。输入:nums=[10,2......
  • 单调栈 详解+例题
    昨天打AT碰到了一道单调栈的题,于是来复习一下单调栈栈内元素单调性有单调递增栈和单调递减栈实现:举个例子:假设入栈序列为142893要模拟一个单调递增栈:\(i=1\)时,栈为空,\(1\)入栈后仍然保持单调性,将\(1\)入栈;\(i=2\)时,栈顶元素为\(1\),\(4\)入栈后......
  • 单调栈-滑动窗口
    830.单调栈模板题:给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出−1。输入格式第一行包含整数N,表示数列长度。第二行包含N个整数,表示整数数列。输出格式共一行,包含NN个整数,其中第i个数表示第i个数的左边第一个比它小的数,如果不存......
  • 高等数学 3.4 函数的单调性与曲线的凹凸性
    目录一、函数单调性的判定法二、曲线的凹凸性与拐点一、函数单调性的判定法定理1设函数\(y=f(x)\)在\([a,b]\)上连续,\((a,b)\)内可导。(1)如果在\((a,b)\)内\(f^{'}(x)\geqslant0\)且等号仅限在有限多个点处成立,那么函数\(y=f(x)\)在\([a,b]\)上单调增......
  • 3307:【例52.1】 不与最大数相同的数字之和
    3307:【例52.1】不与最大数相同的数字之和信息学奥赛一本通-编程启蒙(C++版)在线评测系统[例52.1]不与最大数相同的数字之和1113:不与最大数相同的数字之和信息学奥赛一本通(C++版)在线评测系统openjudge_1.9_07_不与最大数相同的数字之和openjudge_1.9_07_不与最大数......