zoukankan      html  css  js  c++  java
  • hdu 1806 Frequent values 线段树

    题目链接

    给一个非递减数列, n个数, m个询问, 每个询问给出区间[L, R], 求这个区间里面出现次数最多的数的次数。

    非递减数列, 这是最关键的一个条件...

    需要保存一个区间最左边的数, 最右边的数, 最长前缀, 最长后缀, 和这个区间里面次数最多的数的次数。

    一个区间出现最多的数的次数, 应该是左区间和右区间里面取一个最大值。 如果左区间最右边的数和右区间最左边的数相同, 还需要判断这个数左右区间加起来的数量是否大于最大值。

    合并的时候需要判断左区间最右边的数和右区间最左边的数是否相同, 具体看代码。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define pb(x) push_back(x)
     4 #define ll long long
     5 #define mk(x, y) make_pair(x, y)
     6 #define lson l, m, rt<<1
     7 #define mem(a) memset(a, 0, sizeof(a))
     8 #define rson m+1, r, rt<<1|1
     9 #define mem1(a) memset(a, -1, sizeof(a))
    10 #define mem2(a) memset(a, 0x3f, sizeof(a))
    11 #define rep(i, a, n) for(int i = a; i<n; i++)
    12 #define ull unsigned long long
    13 typedef pair<int, int> pll;
    14 const double PI = acos(-1.0);
    15 const double eps = 1e-8;
    16 const int mod = 1e9+7;
    17 const int inf = 1061109567;
    18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
    19 const int maxn = 1e5+5;
    20 int lnum[maxn<<2], rnum[maxn<<2], maxx[maxn<<2], pre_max[maxn<<2], suf_max[maxn<<2];
    21 void pushUp(int rt, int m) {
    22     maxx[rt] = max(maxx[rt<<1], maxx[rt<<1|1]);
    23     lnum[rt] = lnum[rt<<1];
    24     rnum[rt] = rnum[rt<<1|1];
    25     suf_max[rt] = suf_max[rt<<1|1];
    26     if(suf_max[rt] == (m>>1)&&lnum[rt<<1|1] == rnum[rt<<1])         //如果左区间最右边的数和右区间最左边的数相等
    27         suf_max[rt] += suf_max[rt<<1];                              //并且左区间的后缀长度等于这段区间的长度
    28     pre_max[rt] = pre_max[rt<<1];
    29     if(pre_max[rt] == m-(m>>1) && rnum[rt<<1] == lnum[rt<<1|1])
    30         pre_max[rt] += pre_max[rt<<1|1];
    31     if(lnum[rt<<1|1] == rnum[rt<<1])
    32         maxx[rt] = max(maxx[rt], pre_max[rt<<1|1]+suf_max[rt<<1]);
    33 }
    34 void build(int l, int r, int rt) {
    35     if(l == r) {
    36         scanf("%d", &lnum[rt]);
    37         rnum[rt] = lnum[rt];
    38         maxx[rt] = pre_max[rt] = suf_max[rt] = 1;
    39         return ;
    40     }
    41     int m = l+r>>1;
    42     build(lson);
    43     build(rson);
    44     pushUp(rt, r-l+1);
    45 }
    46 int query(int L, int R, int l, int r, int rt) {
    47     if(L<=l&&R>=r) {
    48         return maxx[rt];
    49     }
    50     int m = l+r>>1;
    51     if(R<=m)
    52         return query(L, R, lson);
    53     if(L>m)
    54         return query(L, R, rson);
    55     int tmp1 = query(L, m, lson);
    56     int tmp2 = query(m+1, R, rson);
    57     int tmp3 = 0;
    58     if(lnum[rt<<1|1] == rnum[rt<<1])
    59         tmp3 = min(pre_max[rt<<1|1], R-m)+min(suf_max[rt<<1], m-L+1);
    60     return max(tmp1, max(tmp2, tmp3));
    61 }
    62 int main()
    63 {
    64     int n, m;
    65     while(cin>>n&&n) {
    66         cin>>m;
    67         build(1, n, 1);
    68         while(m--) {
    69             int x, y;
    70             scanf("%d%d", &x, &y);
    71             printf("%d
    ", query(x, y, 1, n, 1));
    72         }
    73     }
    74     return 0;
    75 }
  • 相关阅读:
    探讨游戏服务器设计
    找规律 0 1 3 8 22 64
    mysql 字段对比工具
    游戏开发者网站大集合
    sizeof struct 问题
    微软智力题
    python+requests——读取二进制文件并保存在本地——一个图片作为示例
    python+requests——检查响应头是否存在
    python+requests——读取二进制文件并保存在本地——一个应用程序作为示例
    python+requests——URL的编码和解码
  • 原文地址:https://www.cnblogs.com/yohaha/p/5067773.html
Copyright © 2011-2022 走看看