首页 > 其他分享 >P8600 [蓝桥杯 2013 省 B] 连号区间数 and CF526F

P8600 [蓝桥杯 2013 省 B] 连号区间数 and CF526F

时间:2024-04-07 17:46:36浏览次数:20  
标签:ch Min CF526F 蓝桥 include int 区间 P8600

问题转化

很容易就能把原问题转化成:

求满足 Max-Min = r-l的区间个数

暴力解法

根据上面得到的性质,我们可以暴力枚举区间,来判断当前区间是否满足性质

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <cmath>
#include <string.h>
#define R(x) x = read()
#define For(i, j, n) for (int i = j; i <= n; ++i)
using namespace std;

inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

const int N = 50005;
typedef long long LL;

int n, a[N];
int Log[N];
int Max[N][17], Min[N][17]; //2^16 = 65536

void init()
{
    memset(Min, 0x3f, sizeof(Min));
    Log[0] = -1;
    for(int i = 1; i <= n; i++)
        Log[i] = Log[i>>1] + 1, Min[i][0] = Max[i][0] = a[i];
    for(int j = 1; j <= 16; j++)
    {   
        for(int i = 1; i + (1 << j - 1) <= n; i++)
            Max[i][j] = max(Max[i][j - 1], Max[i + (1 << j - 1)][j -1]),
            Min[i][j] = min(Min[i][j - 1], Min[i + (1 << j - 1)][j - 1]);
    }
}

int query(int l, int r, int t)
{
    int len = r - l + 1;
    if(t)
        return max(Max[l][Log[len]], Max[r - (1 << Log[len]) + 1][Log[len]]);
    else
        return min(Min[l][Log[len]], Min[r - (1 << Log[len]) + 1][Log[len]]);
}

int main()
{
    R(n);
    For(i, 1, n)
        R(a[i]);
    init();
    LL ans = 0ll;
    for(int len = 1; len <= n; len++)
        for(int i = 1; i + len - 1 <= n; i++)
        {
            int j = i + len - 1;
            ans += (query(i, j, 1) - query(i, j, 0) == len - 1);
        }
    printf("%lld\n", ans);
    return 0;
}

分治解

 

标签:ch,Min,CF526F,蓝桥,include,int,区间,P8600
From: https://www.cnblogs.com/smartljy/p/18119449

相关文章

  • 蓝桥杯 历届真题 杨辉三角形【第十二届】【省赛】【C组】
    资源限制内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s思路:    由于我第一写没考虑到大数据的原因,直接判断导致只得了40分,下面是我的代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN......
  • 第十四届蓝桥杯省赛B组
    目录试题A:2023题解正确题解试题B:硬币兑换试题C:松散子序列题解:动态规划试题D:管道题解:二分+区间合并试题E:保险箱试题A:2023题解a='2023'cnt,i,k=0,0,0forjinrange(12345678,98765433):whilei<len(a):whilek<8:ifa[i]==str(j)[k]:......
  • 并查集——蓝桥杯备赛【python】
    一、合根植物试题链接:[蓝桥杯2017国C]合根植物问题描述星球的一个种植园,被分成m×n个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。如果我们告诉你哪些小......
  • 差分和前缀和——蓝桥杯备赛
    一、大学里的树木要打药问题描述教室外有N棵树,根据不同的位置和树种,学校要对其上不同的药。因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。树的编号从0∼N−1且N<1e6。对于树的药是成区间分布,比如3∼5号的树靠近下水道,所以他们要用驱蚊虫的药,20......
  • 蓝桥杯,省赛,动态规划专题,青蛙,更小的数,松散子序列,接龙数列
    #include<bits/stdc++.h>usingnamespacestd;constintN=1e5+9;doublex[N],a[N],b[N];doubledp[N][5];intmain(){intn;cin>>n;for(inti=1;i<=n;i++)cin>>x[i];for(inti=1;i<=n-1;i++)cin>>a[i]>>b[i......
  • 蓝桥杯嵌入式2017年第八届省赛主观题解析
    1 题目2  代码/*USERCODEENDHeader*//*Includes------------------------------------------------------------------*/#include"main.h"#include"rtc.h"#include"tim.h"#include"gpio.h"/*Privateincludes--......
  • [蓝桥杯 2022 国 B] 齿轮(优化枚举)
        根据题目描述,如果采用dfs暴力做法枚举所有方案,肯定会超时,因此我们需要优化枚举,我们都知道在同一组共同转动的齿轮中,线速度相等,因此角速度的比值就是半径的反比,因此我们只需要找到对于每个齿轮作为起始齿轮,只需要找到其倍数半径是否存在即可,而倍数上限就是假设存在......
  • [蓝桥杯 2021 省 B] 杨辉三角形(二分查找+枚举)
        我们之前学过有关杨辉三角的一些性质,我们知道杨辉三角某个数等于左上和右上两个数相加,但是如果我们按照这个性质依次枚举每行每列,就会很容易超时,因此我们可以枚举列,再二分查找行来寻找满足要求的答案,我们可以先将列数到30,基本涵盖了所有的答案,通过组合数性质来二......
  • [蓝桥杯 2022 省 B] 李白打酒加强版(三维动态规划)
        通过题目描述,我们可以知道这道题目涉及到某种状态时候的方案数,因此我们可以用动态规划来解决问题,并且我们需要注意到酒的状态,因此我们可以用三维数组来存储状态,我们知道N,M最大不会超过100,并且如果酒超过了100斗,即使遇到100朵花也无法喝完,因此只需要定义大小都为1......
  • 蓝桥杯 试题 算法训练 拿金币
    问题描述有一个NxN的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。输入格式第一行输入一个正整数n。以下n行描述该方格。金币数保......