首页 > 其他分享 >【单调栈+倍增】[P7167 [eJOI2020 Day1] Fountain

【单调栈+倍增】[P7167 [eJOI2020 Day1] Fountain

时间:2024-08-12 19:54:01浏览次数:7  
标签:eJOI2020 倍增 int sum st vector Fountain Day1

【单调栈+倍增】[P7167 [eJOI2020 Day1] Fountain

思路

用单调栈处理每个圆盘溢出后流到的第一个位置,然后倍增优化。

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    vector<array<i64, 2>> a(n + 1);
    for (int i = 1; i <= n; i ++) {
        cin >> a[i][0] >> a[i][1];
    }

    n ++;
    a.push_back({INT_MAX, INT_MAX});
    vector jump(n + 1, vector<int>(20));
    vector sum(n + 1, vector<i64>(20, INT_MAX));

    stack<int> st;
    for (int i = 1; i <= n; i ++) {
        while (st.size() && a[i][0] > a[st.top()][0]) {
            auto t = st.top();
            jump[t][0] = i;
            sum[t][0] = a[t][1];
            st.pop();
        }
        st.push(i);
    }

    for (int j = 1; (1 << j) <= n; j ++) {
        for (int i = 1; i + (1 << j) <= n; i ++) {
            jump[i][j] = jump[jump[i][j - 1]][j - 1];
            sum[i][j] = sum[jump[i][j - 1]][j - 1] + sum[i][j - 1];
        }
    }

    auto query = [&](int r, int v)->int{
        for (int i = 18; i >= 0; i --) {
            if (v > sum[r][i]) {
                v -= sum[r][i];
                r = jump[r][i];
            }
        }
        return r % n;
    };

    while (m --) {
        int r, v;
        cin >> r >> v;
        cout << query(r, v) << '\n';
    }

    return 0;
}

标签:eJOI2020,倍增,int,sum,st,vector,Fountain,Day1
From: https://www.cnblogs.com/Kescholar/p/18355639

相关文章

  • “Datawhale x魔搭 AI夏令营”-AIGC方向-Day1从零入门AI生图原理&实践
    学习内容提要:从通过代码实现AI文生图逐渐进阶,教程偏重图像工作流、微调、图像优化等思路,最后会简单介绍AIGC应用方向、数字人技术(选学)Task01:简单了解一下文生图相关的基础知识具体Datawhale教程学习内容见链接:https://linklearner.com/activity/14/10/24报名赛事链接:https:/......
  • 【读书笔记-《30天自制操作系统》-1】Day1~Day2
    顾名思义,本书将制作操作系统的整个过程分成了30天来依次讲解。但其实每一天的内容多少与难度各不相同,也并不是每天就可以学习完书中一天的内容。前面的内容要少一些,也比较基础,因此先把第一天和第二天的内容合并起来整理。1.二进制与CPU作者没有从概念开始讲起,而是开篇就......
  • day13(C语言)共用体
    共用体 union不同类型的成员变量共用同一块地址空间使用union格式:union共用体名{成员变量1;成员变量2;};unionhello{inta;charb;};intmain(){unionhelloh1;h1.a=20;h1.b='a';printf("a=%d\n",h1.a);//97}可用验......
  • Vector day12
    packagecom.shujia.day13;importjava.util.Enumeration;importjava.util.Iterator;importjava.util.Vector;/*Collection:-List(有序【指的是存储和取出的顺序是一致的】且可以发生重复,且有索引的概念)-ArrayList:底层数据结构是数组,......
  • ArrayList集合及例题 day12
    packagecom.shujia.day13;importjava.util.ArrayList;importjava.util.Iterator;/*Collection:-List(有序【指的是存储和取出的顺序是一致的】且可以发生重复,且有索引的概念)-ArrayList:底层数据结构是数组,查询快,增删慢,线程不安......
  • C语言学习笔记 Day11(指针--下)
    Day11 内容梳理:目录Chapter7 指针7.6指针&函数(1)形参改变实参的值(2)字符数组作为函数参数1)合并字符串2)删掉字符串中空格(3)指针作为函数返回值Chapter7 指针7.6指针&函数(1)形参改变实参的值前文提到形参无法改变实参,但是通过使用指针就可以改变。因为在......
  • 代码随想录Day11
    150.逆波兰表达式求值给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为'+'、'-'、'*'和'/'。每个操作数(运算对象)都可以是一个整数或者另一个表达式。两个整数之间的除法总是......
  • List集合及List的专有迭代器 day12
    packagecom.shujia.day12;importjava.util.ArrayList;importjava.util.List;importjava.util.ListIterator;/*Collection的子接口:List特点:有序且元素可以发生重复的集合,且有索引下标的概念。*//*List接口中特有的成员方法:(因为List集合有索引的概......
  • Collection中的成员方法2 day12
    packagecom.shujia.day12;importjava.util.ArrayList;importjava.util.Collection;/*Collection中的成员方法:booleanaddAll(Collectionc)将直接添加另一个集合中所有单元素booleanremoveAll(Collectionc)从一个集合中移除另一个......
  • Collection(接口)及对单个元素进行操作day12
    packagecom.shujia.day12;importjava.util.ArrayList;importjava.util.Collection;/*Collection:合层次结构中的根界面。集合表示一组被称为其元素的对象。一些集合允许重复元素,而其他集合不允许。】、有些被命令和其他无序。JDK不提供此接口的任何直接实现:它......