洛谷 U361 序列操作(NOIP模拟赛T2)

题目链接:https://www.luogu.org/problem/show?pid=U361

题目背景

夏令营

题目描述

小B有一个整数序列a[1..N],初始时序列中所有元素均为0。他会在序列上进行下面两种操作,操作共M个:

  1. A l r x:将a[l..r]均加上x。
  2. Q l r:询问a[l..r]中的最大值。

输入输出格式

输入格式:

第一行,两个整数N, M。

接下来的M行,每行一个操作。

输出格式:

设询问操作有T个,则输出T行,每行一个整数,表示询问操作对应的答案。

输入输出样例

输入样例#1:

5 5
A 1 4 1
A 2 5 2
Q 1 4
A 3 4 -2
Q 3 5

输出样例#1:

3
2

很显然地就是一个线段树,甚至几乎是裸的......

但是还是有许多细节需要注意,每次数据结构都是一写就错......

↑你说为什么我放弃了上百毫秒的时间写结构体,因为这样不容易错qwq

(老大:也没看出来你不容易错,还不是改了半天- -)

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4
 5 using namespace std;
 6 const int MAXN = 100000 + 5;
 7 struct seg//建树
 8 {
 9     int l,r;
10     int max = 0;
11     int lazy;
12 } tree[MAXN << 2];
13
14 int max(int a,int b)
15 {
16     return a>b?a:b;
17 }
18
19 void build(int o,int l,int r)
20 {
21     tree[o].l = l;
22     tree[o].r = r;
23     if(l == r)
24         return;
25     int mid = (l + r) >> 1;
26     build(o << 1,l,mid);
27     build(o << 1 | 1,mid + 1,r);
28 }
29
30 void putdown(int o)
31 {
32     tree[o << 1].lazy += tree[o].lazy;
33     tree[o << 1 | 1].lazy += tree[o].lazy;
34     tree[o << 1].max += tree[o].lazy;
35     tree[o << 1 | 1].max += tree[o].lazy;
36     tree[o].lazy = 0;
37 }
38
39 void modify2(int l, int r, int k,int o)
40 {
41     if(l <= tree[o].l && r >= tree[o].r)
42     {
43         tree[o].max += k;
44         tree[o].lazy += k;
45         return;
46     }
47     int mid = (tree[o].l + tree[o].r) >> 1;
48     if(tree[o].lazy)    putdown(o);
49     if(mid >= l)    modify2(l, r, k, o << 1);
50     if(mid < r)     modify2(l, r, k, o << 1 | 1);
51     tree[o].max = max(tree[o << 1].max , tree[o << 1 | 1].max);
52 }
53
54 int ask(int l,int r,int o)//询问操作
55 {
56     if(tree[o].l >= l && tree[o].r <= r)
57     {
58         return tree[o].max;
59     }
60     if(tree[o].lazy)    putdown(o);
61     int ans = -2147483647;//由于每次操作增加的x可能是负值,ans要尽可能小
62     int mid = (tree[o].l + tree[o].r) >>1;
63     if(mid >= l) ans = max(ans,ask(l,r,o << 1));
64     if(mid < r) ans = max(ans,ask(l,r,o <<1|1));
65     return ans;
66 }
67
68 int main()
69 {
70     int a,b,m,n,x;
71     scanf("%d%d",&n,&m);
72     build(1,1,n);
73     char op;
74     for(int i = 1;i <= m;i ++)
75     {
76         scanf("%c",&op);
77         while(op < ‘A‘)
78             scanf("%c",&op);
79         scanf("%d%d",&a,&b);
80         if(op == ‘A‘)
81         {
82             scanf("%d",&x);
83             modify2(a,b,x,1);
84         }
85         if(op == ‘Q‘)
86         {
87             int t = ask(a,b,1);
88             printf("%d\n",t);
89         }
90     }
91     return 0;
92 }

线段树的易错点还是很多的,比如忘写返回值、大于小于号写反、开闭区间写错、函数参数位置颠倒……(没错,以上问题博主都出现过QAQ)写的时候一定要仔细...

时间: 2024-10-13 22:46:04

洛谷 U361 序列操作(NOIP模拟赛T2)的相关文章

洛谷 U360 子矩阵 (NOIP模拟赛T1)题解

题目链接:https://www.luogu.org/problem/show?pid=U360 题目背景 夏令营 题目描述 小A有一个N×M的矩阵,矩阵中1~N*M这(N*M)个整数均出现过一次.现在小A在这个矩阵内选择一个子矩阵,其权值等于这个子矩阵中的所有数的最小值.小A想知道,如果他选择的子矩阵的权值为i(1<=i<=N×M),那么他选择的子矩阵可能有多少种?小A希望知道所有可能的i值对应的结果,但是这些结果太多了,他算不了,因此他向你求助. 输入输出格式 输入格式: 第一行,两个整数

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

DNA序列 LOJ NOIP模拟赛 D1T1 字符串哈希

字符串哈希 上代码 #include<cstdio> #include<cstring> #include<string> #include<iostream> using namespace std; template<class T> inline void read(T &_a){ bool f=0;int _ch=getchar();_a=0; while(_ch<'0' || _ch>'9'){if(_ch=='-'

20161022 NOIP模拟赛 T2 解题报告

旅行者问题 [问题描述] lahub是一个旅行者的粉丝,他想成为一个真正的旅行者,所以他计划开始一段旅行.lahub想去参观n个目的地(都在一条直道上).lahub在起点开始他的旅行.第i个目的地和起点的距离为ai千米(ai为非负整数).不存在两个目的地和起点的距离相同. 从第i个目的地走到第j个目的地所走的路程为 |ai-aj|千米.我们把参观n个目的地的顺序称作一次“旅行”.lahub可以参观他想要参观的任意顺序,但是每个目的地有且只能被参观一次(参观顺序为n的排列). lahub把所有可能

2018.02.12 noip模拟赛T2(未完待续)

二兵的赌注 Description游戏中,二兵要进入了一家奇怪的赌场.赌场中有n个庄家,每个庄家都可以猜大猜小,猜一次一元钱.每一次开彩前,你都可以到任意个庄家那里下赌注.如果开彩结果是大,你就可以得到你之前猜大的庄家相应的ai元钱.如果开彩结果是小,你就可以得到你之前猜小的庄家相应的bi元钱.你可以在同一个庄家那里既猜大又猜小,(这样是两块钱),也可以什么都不猜(这样不用钱).问怎么样下注,才能赢得最多的有保障的钱.有保障的钱指不管开彩结果是大是小,你都能够赢得相应的钱.你能帮助他计算这个值吗

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻

2012-10-20 NOIP模拟赛

      2012-10-20 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas exploit.cpp/c/pas 输入文件 type.in num.in exploit.in 输出文件 type.out num.out exploit.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 256MB 256MB 测试点 5+(5) 10

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

NOIP模拟赛

#1[Nescafé 31]杯NOIP模拟赛 t1 题意:n*m的棋盘上从(1,1)走到(n,m),只能向下或向右,一些格子有老鼠,每个老鼠互不相同,当处于与老鼠有重边的格子时,视为看见了这只老鼠,求到终点看到最少的不同老鼠数. 分析:DP 由于求得是看到的不同的老鼠数目,不能直接用过河卒做,因为同一个位置的老鼠可能会统计多次,我们还需要增加一维即方向. f[i,j,0]表示到从上面一个格子走到(i,j)时最少老鼠数,f[i,j,1]表示左边. f[i,j,0]:=min(f[i-1,j,0]+