zoukankan      html  css  js  c++  java
  • 线段树+树状数组+分块+循环展开 的模板

    #define lson l,m,rt<<1
    #define rson m+1 r,rt<<1|1
    void update(int rt){
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    } 
    void build(int l,int r,int rt){
        if(l==r){
            sum[rt]=z[l];
            return ;
        }
        int m=(l+r)>>1;
        build(lson);
        build(rson);
        update(rt);
    }
    build(1,n,1);
    int query(int l,int r,int rt,int nowl,int nowr){
        if(nowl<=l&&r<=nowr) return sum[rt];
        int m=(l+r)>>1;
        int ans=0;
        if(nowl<=m) ans+=query(lson,nowl,nowr);
        if(m<nowr) ans+=query(rson,nowl,nowr);
        return ans;
    }
    query(1,n,1,l,r);
    void modify(int l,int r,int rt,int p,int v)
    {
        if(l==r){
            sum[rt]=v;
            return;
        }
        int m=(l+r)>>1;
        if(p<=m) modify(lson,p,v);
        else modify(rson,p,v);
        update(rt);
    }
    modify(1,n,1,p,v);
    /*线段树*/


    #define lb(x) ((x)&(-x))
    int modify(int p,int v){
        for(;p<=n;p+=lb(p)) z[p]+=v;
    }
    int query(int p)
    {
        int ans=0;
        for(;p;p-=lb(p)) ans+=a[p];
        return ans;
    }
    /*树状数组*/
    int s=(int)sqrt(n);
    for (int a=1;a<=n;a++)
        belong[a]=(a-1)/s+1;
    for (int a=1;a<=n;a++)
        right[belong[a]]=a;
    for (int a=n;a>=1;a--)
        left[belong[a]]=a;
    for (int a=1;a<=n;a++)
        sum[belong[a]]+=z[a];
    
    int query(int l,int r) {
        int ans=0;
        if (belong[l]==belong[r]) {
            for (int a=l;a<=r;a++)
                ans+=z[a]+col[belong[a]];
        }
        else {
            for (int a=l;a<=right[belong[l]];a++)
                ans+=z[a]+col[belong[a]];
            for (int a=belong[l]+1;a<belong[r];a++)
                ans+=sum[a];
            for (int a=left[belong[r]];a<=r;a++)
                ans+=z[a]+col[belong[a]];
        }
        return ans;
    }
    
    void modify(int l,int r,int v) {
        if (belong[l]==belong[r]) {
            for (int a=l;a<=r;a++) {
                z[a]+=v;
                sum[belong[a]]+=v;
            }
        }
        else {
            for (int a=l;a<=right[belong[l]];a++) {
                z[a]+=v;
                sum[belong[a]]+=v;
            }
            for (int a=belong[l]+1;a<belong[r];a++) {
                col[a]+=v;
                sum[a]+=(right[a]-left[a]+1)*v;
            }
            for (int a=left[belong[r]];a<=r;a++) {
                z[a]+=v;
                sum[belong[a]]+=v;
            }
        }
    }
    int ans=0;
    for (int a=1;a<=n;a++)
        ans += a;
    
    for (int a=1;a<=n;a+=2) {
        ans += a;
        ans += a+1;
    }
    /*循环展开*/
  • 相关阅读:
    几个ssh和sftp的命令
    发现一个github的奇葩设定
    插耳机对orientation sensor的影响
    android中MediaPlayer类的用法
    Oracle 高性能SQL引擎剖析----执行计划
    【转】对列式数据库的一点总结和展望
    【转】大数据分析(Big Data OLAP)引擎Dremel, Tenzing 以及Impala
    TCP/IP协议详解---概述
    读取HttpWebResponse流的两种方法及注意的问题
    This project references NuGet package(s) that are missing on this computer.
  • 原文地址:https://www.cnblogs.com/ZDHYXZ/p/7207126.html
Copyright © 2011-2022 走看看