首页 > 其他分享 >【蓝桥杯集训·每日一题】AcWing 3805. 环形数组

【蓝桥杯集训·每日一题】AcWing 3805. 环形数组

时间:2023-06-05 10:07:05浏览次数:48  
标签:3805 tr 蓝桥 int 最小值 端点 区间 操作 AcWing

写在前面

本人CSDN博客主页:这里

一、题目

1、原题链接

3805. 环形数组

2、题目描述

给定一个长度为 n 的环形数组 a0,a1,…,an−1。

现在要对该数组进行 m 次操作。

操作分为以下两种:

  • 增值操作 l r d,将区间 [l,r] 上的每个元素都增加 d。
  • 求最小值操作 l r输出区间 [l,r] 内的所有元素的最小值

注意,数组是环形的,所以当 n=5 时,区间 [3,1] 内的所有元素依次为 a3,a4,a0,a1。

输入格式

第一行包含整数 n,表示数组长度。

第二行包含 n 个整数,表示 a0,a1,…,an−1。

第三行包含整数 m,表示操作数。

接下来 m 行,每行描述一个操作,对于第 i 行,如果包含两个整数 l,r,则表示第 i 个操作为求最小值操作;如果包含三个整数 l,r,d,则表示第 i 个操作为增值操作。

输出格式

每个求最小值操作输出一行结果。

数据范围

前三个测试点满足 1≤n,m≤10所有测试点满足 1≤n≤2×105,0≤m≤2×105,−106≤ai≤106,0≤l,r≤n−1,−106≤d≤106

输入样例

4 1 2 3 4 4 3 0 3 0 -1 0 1 2 1

输出样例

1 0 0

二、解题报告

1、思路分析

思路来源:y总讲解视频 y总yyds

(1)针对环形的处理:如果输入的区间的右端点小于左端点,则将区间分为两段:[0,左端点][右端点,n];如果输入区间的右端点大于等于左端点正常处理即可。 (2)处理输入问题:读取第二个输入的数的后面的字符,如果输入为\n则说明输入两个数,执行求最小值操作;否则,则执行增值操作。(注意cin不读取空格,需要使用scanf进行读取)。 (3)利用线段树模版进行求解。(详见y总讲解视频

2、时间复杂度

时间复杂度为O(nlogn)

3、代码详解

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;   //注意数据范围,要开long long
const int N=200010;
int n,m;       
int w[N];      //w[]代表初始每个点的值
//线段树结点
struct Node{
    int l,r;   //l,r分别代表当前节点区间左端点和右端点
    LL dt,mn;  //dt代表当前区间要加多少值,mn代表当前区间最小值
}tr[N*4];     //线段树数组要开四倍
void pushup(int u){
    tr[u].mn=min(tr[u<<1].mn,tr[u<<1|1].mn);
}
void pushdown(int u){
    auto &root=tr[u],&l=tr[u<<1],&r=tr[u<<1|1];
    l.dt+=root.dt,l.mn+=root.dt;
    r.dt+=root.dt,r.mn+=root.dt;
    root.dt=0;
}
//构建线段树
void build(int u,int l,int r){
    if(l==r) tr[u]={l,r,0,w[r]};
    else{
        tr[u]={l,r};
        int mid=l+r>>1;
        build(u<<1,l,mid),build(u<<1|1,mid+1,r);
        pushup(u);
    }
}
void update(int u,int l,int r,int d){
    if(tr[u].l>=l&&tr[u].r<=r){
        tr[u].dt+=d,tr[u].mn+=d;
    }
    else{
        pushdown(u);
        int mid=tr[u].l+tr[u].r>>1;
        if(l<=mid) update(u<<1,l,r,d);
        if(r>mid) update(u<<1|1,l,r,d);
        pushup(u);
    }
}
LL query(int u,int l,int r){
    if(tr[u].l>=l&&tr[u].r<=r) return tr[u].mn;
    else{
        pushdown(u);
        int mid=tr[u].l+tr[u].r>>1;
        LL res=1e18;
        if(l<=mid) res=min(res,query(u<<1,l,r));
        if(r>mid) res=min(res,query(u<<1|1,l,r));
        return res;
    }
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++) cin>>w[i];
    build(1,0,n-1);
    cin>>m;
    while(m--){
        int l,r;
        char c;
        scanf("%d %d%c",&l,&r,&c);   //cin不接收空格
        if(c=='\n'){
            if(l<=r) cout<<query(1,l,r)<<endl;
            else cout<<min(query(1,0,r),query(1,l,n-1))<<endl;
        }
        else{
            int d;
            cin>>d;
            if(l<=r) update(1,l,r,d);
            else update(1,0,r,d),update(1,l,n-1,d);
        }
    }
    return 0;
}

三、知识风暴

线段树

标签:3805,tr,蓝桥,int,最小值,端点,区间,操作,AcWing
From: https://blog.51cto.com/u_15720469/6413167

相关文章

  • 蓝桥杯----动态规划训练
    最长上升子序列 之前我定义的dp是:dp[n][i]:表示在前n个数中选,并以数a[i]结尾的最长上升序列但是这个状态的转移有点不自然,感觉就想有很多多余的感觉if(i<=n-1)dp[n][i]=dp[n-1][i]if(a[i]>a[j]&&j<=n-1)dp[n][i]=max(dp[n][i],dp[......
  • 第十届蓝桥杯c++b组国赛题解(还在持续更新中...)
    试题A:平方序列解题思路:直接枚举一遍x的取值,然后按照题目给定的式子算出y,每次取x+y的最小值即可答案为7020代码实现:#include<iostream>#include<algorithm>#include<cmath>usingnamespacestd;#defineintlonglongconstintN=1e4+5;signedmain(){ //记录答案......
  • 蓝桥WP
    CyberChef可以看出是先将flagbase64加密一下然后ROT13加密先手动爆破出ROT13得ZmxhZ3tkY2I3N2FiYy02NDQ1LTQ4NDAtYmJjYS01MjUyZjYwNzM1ZTd9然后base64解密得flagflag{dcb77abc-6445-4840-bbca-5252f60735e7}XORIDA64打开,一眼小端序和循环异或key为SEcRET7,写个脚本fl......
  • 【蓝桥杯集训·每日一题】AcWing 1079. 叶子的颜色
    写在前面本人CSDN博客主页:这里一、题目1、原题链接1079.叶子的颜色2、题目描述给一棵有m个节点的无根树,你可以选择一个度数大于1的节点作为根,然后给一些节点(根、内部节点、叶子均可)着以黑色或白色。你的着色方案应保证根节点到各叶子节点的简单路径上都至少包含一个有色节点,哪......
  • 2016第七届蓝桥杯国赛决赛c/c++本科B组试题总结及解题答案
    未完待更新........1.一步之遥从昏迷中醒来,小明发现自己被关在X星球的废矿车里。矿车停在平直的废弃的轨道上。他的面前是两个按钮,分别写着“F”和“B”。小明突然记起来,这两个按钮可以控制矿车在轨道上前进和后退。按F,会前进97米。按B会后退127米。 透过昏暗的灯光,小明看......
  • 蓝桥杯----图论训练
    STL当想要维护一个数组,其中的元素要求有序,同时可能随时对这个数组中的元素进行增减有没有一个STL可以快速维护一个这样的数组?multiset(平衡二叉树) 默认从小到大排序注意离散化中清除重复元素的原理:unique()函数     vector......
  • P9241 [蓝桥杯 2023 省 B] 飞机降落
    题目描述N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti​ 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 Di​ 个单位时间,即它最早可以于 Ti​ 时刻开始降落,最晩可以于 +Ti​+Di​ 时刻开始降落。降落过程需要 Li​ 个单位时间。一架飞机......
  • 从蓝桥杯来谈Fibonacci数列
    2014年蓝桥杯的第九题是这样描述的:     给定Fibonacci数列F[],其中,,求表达式      的值。其中在讲解这道题之前,我们先来看一个简单版的。题目如下:题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1194分析:可以看出本题就是直接求,虽然这里的......
  • [蓝桥杯 2022 省 B] 扫雷
    [蓝桥杯2022省B]扫雷题目描述小明最近迷上了一款名为《扫雷》的游戏。其中有一个关卡的任务如下,在一个二维平面上放置着 n 个炸雷,第 2023-05-31i 个炸雷 (,,)(xi​,yi​,ri​) 表示在坐标 (,)(xi​,yi​) 处存在一个炸雷,它的爆炸范围是以半径为 ri​ 的一个圆。......
  • 初见蓝桥杯
    由于我怕我太菜所以大一没报蓝桥杯比赛(我这个人很自卑呜呜呜)P8637[蓝桥杯2016省B]交换瓶子题目描述有 N 个瓶子,编号 1∼N,放在架子上。比如有 55 个瓶子:2,1,3,5,4要求每次拿起 22 个瓶子,交换它们的位置。经过若干次后,使得瓶子的序号为:1,2,3,4,5对于这么简......