首页 > 其他分享 >2023NOIP A层联测30 A. 草莓列车

2023NOIP A层联测30 A. 草莓列车

时间:2023-11-13 16:26:35浏览次数:24  
标签:lg int max 30 st Maker 联测 x0 2023NOIP

2023NOIP A层联测30 A. 草莓列车

目录

题目大意

给定一个序列 \(a\) ,有 \(m\) 次操作,将 \([l , r]\) 的每个 \(a_i\) 变为 \(max (a_i , v)\)

\(n \le 10 ^5 , m \le 10^7\)

思路

对于每个数,只用用它本身和每个涉及到它的查询里面的最大值比较就好了。

我们要找到一种操作,可以 \(O(1)\) 修改, \(O(n\log_2n)\) 查询。

考虑用 \(st\) 表,设 \(st_{i , j}\) 表示在 \([i , i +2^j - 1]\) 里的最大值

每次询问 \(l , r , v\) ,设 \(lg = \log_2(r - l + 1)\)

每次修改:

\[st_{l , lg} = \max (st_{l , lg} , v) \newline st_{r - 2^{lg} + 1 , lg} = \max (st_{r - 2 ^{lg} + 1 , lg} , v) \]

最后由上往下更新:

\[st_{i , j} = \max (st_{i , j} , st_{i , j +1}) \newline st_{i + 2^j , j} = \max (st_{i +2^j , j} , st_{i , j + 1}) \]

code

#include <bits/stdc++.h>
#define LL long long
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
#define fd(x , y , z) for(int x = y ; x >= z ; x --)
using namespace std;
const int N = 1e5 + 5;
LL a[N] , st[N][25];
namespace Maker{
	unsigned int x0 , seed;
	void init() { scanf ("%u%u" , &x0 , &seed); }
	inline unsigned int getnum(){
		x0 = (x0 << 3) ^ x0;
		x0 = ((x0 >> 5) + seed) ^ x0;
		return x0;
	}
}
int n,m,typ;
int main () {
    freopen ("train.in" , "r" , stdin);
    freopen ("train.out" , "w" , stdout);
	scanf ("%d%d%d" , &n , &m , &typ);
    fu (i , 1 , n) scanf ("%lld" , &a[i]);
	Maker::init();
	fu (i , 1 , m) {
		int l = Maker::getnum() % n + 1 , r = Maker::getnum() % n + 1;
		LL v = Maker::getnum();
		if (l > r) swap (l , r);
		if(typ == 1) l = 1;
        int lg = log2 (r - l + 1);
        st[l][lg] = max (st[l][lg] , v);
        st[r - (1 << lg) + 1][lg] = max (st[r - (1 << lg) + 1][lg] , v);
        // cout << l << " " << r << " " << v << "\n";
        // cout << lg << " ";
    }
    fd (j , 20 , 0) {
        for (int i = 1 ; i + (1 << j) <= n ; i ++) {
            st[i][j] = max (st[i][j] , st[i][j + 1]);
            st[i + (1 << j)][j] = max (st[i + (1 << j)][j] , st[i][j + 1]);
        }
    }
    fu (i , 1 , n) printf ("%lld " , max (a[i] , st[i][0]));
    return 0;
}

标签:lg,int,max,30,st,Maker,联测,x0,2023NOIP
From: https://www.cnblogs.com/2020fengziyang/p/17829403.html

相关文章

  • CF300B Coach 题解
    闲话调了好一会,甚至还重构了一次代码才对,但是还是很喜欢并查集,并查集可爱捏。题意省流$n$个学生分成$3$人一组,要满足$m$个条件,每个条件给出两个数$x,y$,要求$x$和$y$必须在一个组里。正文要使学生三人一组,一眼使用并查集。首先考虑无解(输出$-1$)的情况:给出的限......
  • 在工作站计算机配置等待设备安装任务完成的秒数为 300 秒
    一、打开本地组策略WIN+R二、步骤打开计算机配置\管理模板\系统\设备安装配置设备安装超时 三、操作启用......
  • DP4301-M无线模块一款SUB-1G无线收发模块无线抄表智能家居手持设备
    DP4301-M无线模块是一款低成本高效率工作于1GHz以内的收发模块,支持中国智能电无线集抄标准470MHz~510MHz,兼容433MHzISM/SRD频段均可使用。此模块且前已经超大量应用于国标智能无线抄表及物联网自组网等双向数据传输系统方案,模块具备的低功耗、高接收灵敏度、高发射功率诸多优......
  • 10月30日总结
    今天的上午进行了机器人的拆装实训,感觉还是比较简单的,毕竟是自己拆自己安装。下午进行了一次数据库连接的增删改查的web页面的可视化。感觉还是比较难,但是由于是限时测试,还是没有做完。还是在课下继续努力练习。......
  • 2023-2024-1 学号:20231305 《计算机基础与程序设计》第7周学习总结
    2023-2024-1学号:20231305《计算机基础与程序设计》第7周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2022-2023-1计算机基础与程序设计第一周作业)这个作业的目标<自学教材计算......
  • 2023-2024-1 20231306 《计算机基础与程序设计》第七周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2023-2024-1计算机基础与程序设计第七周作业这个作业的目标数组与链表、基于数组和基于链表实现数据结构、无序表与有序表、树、图、子程序与参数......
  • 2023-2024-1 20231301 《计算机基础与程序设计》第七周学习总结
    2023-2024-120231301《计算机基础与程序设计》第七周学习总结作业信息作业链接作业课程<班级>(2023-2024-1-计算机基础与程序设计)作业要求<作业>(2023-2024-1计算机基础与程序设计第七周学习总结)作业目标<《计算机基础与程序设计》预习第八章>《计算机基础......
  • 2023-2024-1 20231309 《计算机基础与程序设计》第七周学习总结
    2023-2024-120231309《计算机基础与程序设计》第七周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第七周作业这个作业的目标作业正文2023-2024-120231309《计算机基础与程......
  • 30.随机数
    随机数在程序开发过程中,经常会使用到随机数,Python中,可以使用 random 模块中的 randint() 函数获取随机数。格式: randint(start,stop)start 为随机数获取初始范围stop 为随机数获取结束范围,包含该值。使用该函数前需要导入, fromrandomimportrandintfromrand......
  • 2023-2024-1 20231303 《计算机基础与程序设计》赵泊瑄第七周学习总结
    2023-2024-120231303《计算机基础与程序设计》赵泊瑄第七周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里作业要求的链接2023-2024-1计算机基础与程序设计第七周作业)这个作业的目标总结第七周学习收获作业正文......