zoukankan      html  css  js  c++  java
  • 树状数组模板,RMQ模板

    昨天讲的是树状数组和RMQ,今天做了几个题总结了一下模板,至于树状数组的精髓就在这个图当中吧

    rmq就是储存2^k的数据递归查询  利用二分和分治的思想:

    树状数组:

     1 int c[50005];
     2 int n;
     3 int lowbit(int x)
     4 {
     5     return x&(-x);
     6 }
     7 void add(int i, int val)
     8 {
     9     while(i<=n)
    10     {
    11         c[i]+=val;
    12         i+=lowbit(i);
    13     }
    14 }
    15 void sub(int i, int val)
    16 {
    17     while(i<=n)
    18     {
    19         c[i]-=val;
    20         i+=lowbit(i);
    21     }
    22 }
    23 int sum(int i)
    24 {
    25     int s=0;
    26     while(i>0)
    27     {
    28         s+=c[i];
    29         i-=lowbit(i);
    30     }
    31     return s;
    32 }
    33 //已通过测试

    rmq模板:

     1 #include<iostream>
     2 #include<string.h>
     3 #include<stdio.h>
     4 #include<algorithm>
     5 #include<math.h>
     6 using namespace std;
     7 
     8 const int maxn=1005;
     9 int dp[maxn][20];
    10 int a[maxn];
    11 
    12 void init(int n)
    13 {
    14     memset(dp,0,sizeof(dp));
    15     for(int i=1;i<=n;i++)
    16     {
    17         dp[i][0]=a[i];
    18     }
    19     int mm=log(1.0*n)/log(2.0);
    20     for(int j=1;j<=mm;j++)
    21     {
    22         for(int i=1;i+(1<<(j-1))<=n;i++)
    23         {
    24             dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
    25         }
    26     }
    27 }
    28 
    29 int query(int l,int r)
    30 {
    31     int mm=log(1.0*(r-l))/log(2.0);
    32     return max(dp[l][mm],dp[r-(1<<mm)+1][mm]);
    33 }
    34 
    35 
    36 int main()
    37 {
    38     int n;
    39     freopen("aa.txt","r",stdin);
    40     while(cin>>n)
    41     {
    42         for(int i=1;i<=n;i++)
    43         {
    44             cin>>a[i];
    45         }
    46         init(n);
    47         int q;
    48         cin>>q;
    49         int x1,y1;
    50         while(q--)
    51         {
    52             cin>>x1>>y1;
    53             cout<<query(x1,y1)<<endl;
    54         }
    55     }
    56 }
    57 //已通过测试

    题目:

    树状数组:

    HDU 1166  纯模板题

    HLG 1161  模板+对于时间的控制(在time时间内恢复)  用一个数组标记即可

    //明天把题目再把题目加上

  • 相关阅读:
    1 外部JavaScript
    1 外部JavaScript
    蓝桥杯:位运算
    Java为什么要配置环境变量
    java数组静态复制和动态复制越界问题
    Dijkstra算法java实现
    离散二元关系实验java实现
    Java中字符串split() 的使用方法
    用java编程实现集合的交、并、差和补运算
    61根据字符出现频率排序(451)
  • 原文地址:https://www.cnblogs.com/zhanzhao/p/3581453.html
Copyright © 2011-2022 走看看