一本通1549最大数

2023-11-09 17:30
文章标签 一本 最大数 1549

本文主要是介绍一本通1549最大数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1549:最大数

题目描述

原题来自:JSOI 2008

给定一个正整数数列 a1,a2,a3,,an,每一个数都在 0p1 之间。可以对这列数进行两种操作:

  • 添加操作:向序列后添加一个数,序列长度变成 n+1;
  • 询问操作:询问这个序列中最后 L 个数中最大的数是多少。

程序运行的最开始,整数序列为空。写一个程序,读入操作的序列,并输出询问操作的答案。

输入格式

第一行有两个正整数 m,p,意义如题目描述;

接下来 m 行,每一行表示一个操作。如果该行的内容是 Q L,则表示这个操作是询问序列中最后 L 个数的最大数是多少;如果是 A t,则表示向序列后面加一个数,加入的数是 (t+a)modp。其中,t 是输入的参数,a 是在这个添加操作之前最后一个询问操作的答案(如果之前没有询问操作,则 a=0)。

第一个操作一定是添加操作。对于询问操作,L>0 且不超过当前序列的长度。

输出格式

对于每一个询问操作,输出一行。该行只有一个数,即序列中最后 L 个数的最大数。

样例
样例输入
10 100
A 97
Q 1
Q 1
A 17
Q 2
A 63
Q 1
Q 1
Q 3
A 99
样例输出
97
97
97
60
60
97
样例说明

最后的序列是 97,14,60,96。

数据范围与提示

对于全部数据,1m2×105,1p2×109,0t<p。

 

sol:首先很容易发现这是一道线段树模板题,先建一棵20000个节点的线段树初始全赋为-inf,然后每次修改单个节点,区间查询就可以了

但是否还有别的做法呢?我看了题解后原来还有逆向ST表,很厉害啊

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=200005,inf=0x3f3f3f3f,Bj=200000;
 4 int m,Mod;
 5 int Root[N];
 6 struct SegmentTree
 7 {
 8     int Max[N<<2];
 9     inline void Build(int l,int r,int x)
10     {
11         Max[x]=-inf; if(l==r) return;
12         int mid=(l+r)>>1;
13         Build(l,mid,x<<1);
14         Build(mid+1,r,x<<1|1);
15         return;
16     }
17     inline void Change(int l,int r,int Pos,int Tag,int x)
18     {
19         if(l==r) {Max[x]=Tag; return;}
20         int mid=(l+r)>>1;
21         if(Pos<=mid) Change(l,mid,Pos,Tag,x<<1);
22         else Change(mid+1,r,Pos,Tag,x<<1|1);
23         Max[x]=max(Max[x<<1],Max[x<<1|1]);
24         return;
25     }
26     inline int Que(int l,int r,int ql,int qr,int x)
27     {
28         if(ql==l&&qr==r) return Max[x];
29         int mid=(l+r)>>1;
30         if(qr<=mid) return Que(l,mid,ql,qr,x<<1);
31         else if(ql>mid) return Que(mid+1,r,ql,qr,x<<1|1);
32         else return max(Que(l,mid,ql,mid,x<<1),Que(mid+1,r,mid+1,qr,x<<1|1));
33     }
34 }T;
35 int main()
36 {
37     int i,ans=0,Len=0;
38     memset(Root,0,sizeof Root);
39     T.Build(1,Bj,1);
40     scanf("%d%d",&m,&Mod);
41     for(i=1;i<=m;i++)
42     {
43         int x; char S[5];
44         scanf("%s%d",S+1,&x);
45         switch (S[1])
46         {
47             case 'A':
48                 x=(ans+x)%Mod;
49                 T.Change(1,Bj,++Len,x,1);
50                 break;
51             case 'Q':
52                 ans=T.Que(1,Bj,Len-x+1,Len,1);
53                 printf("%d\n",ans);
54                 break;
55         }
56     }
57     return 0;
58 }
59 /*
60 input
61 10 100
62 A 97
63 Q 1
64 Q 1
65 A 17
66 Q 2
67 A 63
68 Q 1
69 Q 1
70 Q 3
71 A 99
72 output
73 97
74 97
75 97
76 60
77 60
78 97
79 */
线段树
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=200005;
 4 int Bin[23],Log[N];
 5 int m,Mod,f[N][23];
 6 int main()
 7 {
 8     int i,j,ans=0,Len=0;
 9     Bin[0]=1; for(i=1;i<=19;i++) Bin[i]=Bin[i-1]<<1;
10     Log[0]=-1; for(i=1;i<N;i++) Log[i]=Log[i>>1]+1;
11     scanf("%d%d",&m,&Mod);
12     for(i=1;i<=m;i++)
13     {
14         int x; char S[5];
15         scanf("%s%d",S+1,&x);
16         switch (S[1])
17         {
18             case 'A':
19                 x=(x+ans)%Mod;
20                 f[++Len][0]=x;
21                 for(j=1;Bin[j]<=Len;j++) f[Len][j]=max(f[Len][j-1],f[Len-Bin[j-1]][j-1]);
22                 break;
23             case 'Q':
24                 int oo=Log[x];
25                 ans=max(f[Len][oo],f[Len-x+1+Bin[oo]-1][oo]);
26                 printf("%d\n",ans);
27                 break;
28         }
29     }
30     return 0;
31 }
32 /*
33 input
34 10 100
35 A 97
36 Q 1
37 Q 1
38 A 17
39 Q 2
40 A 63
41 Q 1
42 Q 1
43 Q 3
44 A 99
45 output
46 97
47 97
48 97
49 60
50 60
51 97
52 */
逆向ST表

 

转载于:https://www.cnblogs.com/gaojunonly1/p/10352114.html

这篇关于一本通1549最大数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377552

相关文章

【简历】25届南京某一本JAVA简历:简历通过率还好,但是拿不到OFFER

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 今天看一份25届南京某一本大学的Java简历。 这个简历呢,学校是一本。我们说上来先要定校招层次,这个层次就按照中厂来讲。因为现在很多的双非一本目标都是在中厂。 这个同学有个实习经历,一本有八成的同学主项目都是重复的。HR他只能看到项目重不重复,要点对不对他不知道,就从这个角度来看,这位同学

【LeetCode】321. 拼接最大数(贪心+单调栈类型题)

在做帆软笔试的时候,最后一道题一直没想出来。 题目:在两个数组中选取 k 个元素,拼接一个最小数,并且要保证来自同一数组的元素顺序不发生改变。 搜索后发现是 LeetCode 321 拼接最大数的变形题,借此题学习一下。 402. 移掉 K 位数字(中等) 402. 移掉 K 位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。 注意: n

【简历】25届重庆某一本JAVA简历:比赛项目描述都是无用的废话

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这是一个重庆某一本大学25届硕士的Java简历,这个简历,其实还是有一定东西的,然后我们说这个,这是一个重点类的一个一本,所以我们说就按照大厂来讲,但是,其实这后面的这个项目经历不行,就按大厂来讲吧,但是这个按大厂的话,这个学校在大厂里面是最差的一个背景了,他是个减分项,项目这块呢,优势不强啊,

C++类实现最大数的输出

Description 判断整数的大小,输入n个数,找出最大的数并输出。 Input 有多组测试实例,输入n,并输入n个数。 Output 输出的最大的数,每个输出结果占一行。 Sample Input 101 2 3 4 5 6 7 8 9 10 Sample Output 10 #include<iostream>#inc

HYSBZ 1012 最大数maxnumber

思路:在单调队列不更新列首,因为查询区间大小不确定,所以不能保证下次是否还用到它 #include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 222222#define ll long longint que[N];ll m,d;ll a[N];int cnt;ch

基础算法--递推算法[信奥一本通]

本节所讲题源自【信奥一本通】C++版:基础算法-第三章-递推算法 相信大家应该都接触过数列的概念。哎哟,一直在跟数组打交道,说数列感觉好陌生,哈哈。数列中的迭代法大家都还记得吗:通过反复应用特定规则,推导出某一点起始的连续的后续数列。 我们的递推也是这样,给出一些初始值,从题目中找出后续数据应该与已知数据存在哪些关系,能不能写出一个公式或者经过同种操作进行反复推导,得出结论。在数学中

一本读懂数据库发展史的书

数据库及其存储技术,一直以来都是基础软件的主力。数据库系统的操作接口标准,也是应用型软件的重要接口,关系重大。 作为最“有感”的系统软件,数据库的历史悠久、品类繁多、创新活跃。 对数据库历史发展的介绍,有利于新一代技术人员的学习和传承;对未来演进的探究,有利于数据库开发者的思考和实践。 如果想对当今数据库体系有一个深入的了解,最好学习一下数据库的发展史。这对于在我们脑海里建立数据库体系的知识

C++题解(23) 信息学奥赛一本通:1026:空格分隔输出

【题目描述】 读入一个字符,一个整数,一个单精度浮点数,一个双精度浮点数,然后按顺序输出它们,并且要求在他们之间用一个空格分隔。输出浮点数时保留6位小数。 【输入】 第一行是一个字符; 第二行是一个整数; 第三行是一个单精度浮点数; 第四行是一个双精度浮点数。 【输出】 输出字符、整数、单精度浮点数和双精度浮点数,之间用空格分隔。 【输入样例】 a122.33.

【简历】25届青岛某一本JAVA简历:中厂不要强调算法,面试官听不懂

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 今天我们要看的是一位来自25届青岛某一本硕士同学的Java简历。 依旧是先判断自己要投什么层次的厂,也就是我们校招第一法则:定层次。 因为在不同的层次,面试官的要求,考察的时间点和内容都不太一样。 一本的话,我们大多定在中厂,在一线城市薪资在一万到一万五左右。 但有些比较好的理工类或者是

如何用GPT写一本玄幻爽文小说?轻松上手

如果要写一本玄幻爽文小说,你完全可以用GPT来帮忙,这可是一条捷径。无论是创造奇妙的世界观,设计角色,还是编写剧情,我们都可以用GPT快速推进创作。下面就是一份实操教程,从构思到完成一本玄幻爽文,手把手教你如何用GPT搞定! 1. 构思故事的核心:背景设定与主线 步骤1:确定世界观 玄幻爽文的魅力在于其独特的世界观,比如修真世界、魔法大陆、异能都市等等。利用GPT生成背景设定,可