线段树——忠诚——洛谷——1816

本次的目的主要在于练一练线段树的模板。

这题做法颇多,可以RMQ也可以线段树

#include<iostream>
#include<cstdio>
using namespace std;
inline int read(){
    int t=1,num=0;char c=getchar();
    while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();}
    return num*t;
}
const int maxn=100010,INF=0x7fffffff;
inline int min(int a,int b){return a<b?a:b;}
int a[maxn],t[4*maxn],n,m;
void build(int ro,int l,int r){
    if(l==r){t[ro]=a[l];return;}
    int mid=(l+r)>>1;
    build(ro*2,l,mid);build(ro*2+1,mid+1,r);
    t[ro]=min(t[ro*2],t[ro*2+1]);
}
int ask(int ro,int l,int r,int x,int y){
    if(x>r||y<l)return INF;
    if(x<=l&&r<=y)return t[ro];
    int mid=(l+r)>>1;
    return min(ask(ro*2,l,mid,x,y),ask(ro*2+1,mid+1,r,x,y));
}
int main()
{
    n=read();m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int x=read(),y=read();
        printf("%d ",ask(1,1,n,x,y));
    }
    return 0;
}

在做这题的过程中,我发现线段树,如果单点更新没有

if(x<=mid)change(ro*2,l,mid);
else  change(ro*2+1,mid+1,r);

或者

if(x<l||x>r) return;

的话,时间效率会退化成o(n)。

然后我没加,这就成了我这题T了的原因。

不要问我会写到单点修改。其实上述代码中并没有单点修改。

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

时间: 2024-08-04 18:31:54

线段树——忠诚——洛谷——1816的相关文章

线段树——最大数——洛谷——1198

这题可以说是模板题了. 只需要预先开好m大小的线段树,就好了,这就可以处理加点的问题. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define ll long long inline ll read(){ ll t=1,num=0;char c=getchar(); while(c>'9'||c<'

【模板】线段树 1(洛谷_3372)

这题的做法就像题目说的那样. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define ll long long inline ll read(){ ll t=1,num=0;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar(

忠诚——洛谷——1816——RMQ

知道了RMQ后,随便打打就好了. 其实我是来复习RMQ的. #include<iostream> #include<cstdio> #include<cmath> using namespace std; inline int read(){ int t=1,num=0;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')t=-1;c=getchar();} while(c>='0'&&c&l

AC日记——忠诚 洛谷 P1816

题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了怀疑.于是他决定用一种特别的方法来判断管家的忠诚,他把每次的账目按1,2,3…编号,然后不定时的问管家问题,问题是这样的:在a到b号账中最少的一笔是多少?为了让管家没时间作假他总是一次问多个问题. 输入输出格式 输入格式: 输入中第一行有两个数m,n表示有m(m<=100000)笔账,n表示有n个问

洛谷P3372 【模板】线段树 1

P3372 [模板]线段树 1 153通过 525提交 题目提供者HansBug 标签 难度普及+/提高 提交  讨论  题解 最新讨论 [模板]线段树1(AAAAAAAAA- [模板]线段树1 洛谷评测机出问题了吗? 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接

20190729 线段树

线段树真是一个很重要很重要的数据结构!!! 一.概念 线段树是一棵二叉树,每个节点维护序列的一段区间 二.复杂度 o(nlogn) 开数组一般要开四倍空间 三.相关量 儿子:除了叶子节点,每个节点都有左儿子和右儿子 左儿子:左儿子的节点编号是父节点的两倍2 * ro,对应父节点左一半区间[l,mid] 右儿子:右儿子的节点编号是父节点的二倍加一2 * ro + 1,对应父节点右一半区间[mid + 1,r] 四.一些操作 1.建树o(n) 我比较喜欢用结构体存每个节点的信息 struct nod

二分查找or线段树(借教室洛谷1083vijos1782NOIP 2012 提高组 第二天 第二题)

在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然希望编程解决这个问题.我们需要处理接下来n天的借教室信息,其中第i天学校有ri个教室可供租借.共有m份订单,每份订单用三个正整数描述,分别为dj,sj,tj,表示某租借者需要从第sj天到第tj天租借教室(包括第sj天和第tj天),每天需要租借dj个教室. 我们假定,租借者对教室的大小.地点没有要求.即对于每份

洛谷P1531 I Hate It 线段树

洛谷P1531 I Hate It 线段树 单点修改 区间求最大 1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using

洛谷1558 色板游戏 线段树

我先立个Flag 我,这几天,要过1W道线段树题. 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:1. "C A B C" 指在A到 B 号方格中涂上颜色 C.2. "P A B" 指老师的提问:A到 B号方格中有几种颜色.学校的颜料盒中一共有 T 种颜料.为简便起见,我