zoukankan      html  css  js  c++  java
  • 线段树-区间最大连续1 NKOJ2753

    结构体 node 中 l 表示左界,r 表示右界, cons_l 从左开始最大连续1, cons_r ...,max 区间最大连续1

    代码

     1 #include <stdio.h>
     2 #include <queue>
     3 #include <algorithm>
     4 
     5 using namespace std;
     6 
     7 const int _N = 120000;
     8 
     9 struct node {
    10     int l, r, cons_l, cons_r, max;
    11     bool full() { return cons_l == r-l+1; }
    12 } T[900000];
    13 
    14 bool A[_N];
    15 int x, y, n, m;
    16 
    17 void _update(int p)
    18 {
    19     if (T[p<<1].full()) T[p].cons_l = T[p<<1].max + T[p<<1|1].cons_l;
    20     else T[p].cons_l = T[p<<1].cons_l;
    21     if (T[p<<1|1].full()) T[p].cons_r = T[p<<1|1].max + T[p<<1].cons_r;
    22     else T[p].cons_r = T[p<<1|1].cons_r;
    23     T[p].max = max(max(T[p<<1].max, T[p<<1|1].max), T[p<<1].cons_r+T[p<<1|1].cons_l);
    24     return;
    25 }
    26 
    27 void _init(int p, int l, int r)
    28 {
    29     T[p].l = l, T[p].r = r;
    30     if (l == r) { T[p].cons_l = T[p].cons_r = T[p].max = A[l]; return; }
    31     int mid = l+r >> 1;
    32     _init(p<<1, l, mid), _init(p<<1|1, mid+1, r);
    33     _update(p);
    34     return;
    35 }
    36 
    37 int _query(int p)
    38 {
    39     if (x <= T[p].l && T[p].r <= y) return T[p].max;
    40     int cnt = 0, mid = T[p].l+T[p].r >> 1;
    41     if (x <= mid && y >= T[p].l) cnt = max(cnt, _query(p<<1));
    42     if (x <= T[p].r && y > mid) cnt = max(cnt, _query(p<<1|1));
    43     if (x <= mid && mid < y) cnt = max(cnt, min(T[p<<1].cons_r, mid-x+1) + min(T[p<<1|1].cons_l, y-mid));
    44     return cnt;
    45 }
    46 
    47 int main()
    48 {
    49     int i;
    50     scanf("%d%d", &n, &m);
    51     for (i = 1; i <= n; ++i) {
    52         int tmp;
    53         scanf("%d", &tmp), A[i] = tmp;
    54     }
    55     _init(1, 1, n);
    56     for (i = 1; i <= m; ++i) {
    57         scanf("%d%d", &x, &y);
    58         printf("%d
    ", _query(1));
    59     }
    60     return 0;
    61 }
    View Code

    题目:

    P2753区间连续值
    时间限制 : 10000 MS   空间限制 : 65536 KB
    问题描述

    有一数列只有0和1构成,数列中数字个数为为n。
    现在有m个形式为x y的提问,询问区间[x,y]中,最多有多少个连续的1。
    对于每个询问,请你快速做出回答

    输入格式

    第一行,两个整数n和m
    第二行,n个空格间隔的数字,表示数列
    接下来m行,每行两个空格间隔的整数x和y,表示一个询问(x<=y)

    输出格式

    m行,每行一个整数,对应询问的答案

    样例输入

    9 3
    1 0 0 0 1 1 1 0 1
    1 9
    3 6
    2 4

    样例输出

    3
    2
    0

    提示

    1<=n,m<=100000

  • 相关阅读:
    ctrl+d与ctrl+c
    SIGTERM等信号含义
    truss命令
    strings命令
    touch命令
    C语言的readlink
    P1065 [NOIP2006 提高组] 作业调度方案
    P1786 帮贡排序
    P1098 [NOIP2007 提高组] 字符串的展开
    P1591 阶乘数码
  • 原文地址:https://www.cnblogs.com/ghcred/p/8194011.html
Copyright © 2011-2022 走看看