zoukankan      html  css  js  c++  java
  • 2019.9.4 校门外的树

    那个校门外的树?你想多了

    题目传送门

    对于这样定值的区间修改 我们有一种叫做括号序列的方法

    我们修改区间时 将其左端点l标记为左括号 右端点右括号

    所以我们每次查询时 首先查找右端点左侧有多少个左括号

    (即有多少区间起点)

    再查找左端点左侧有多少个右括号(已经匹配了多少区间)

    二者相减即可

    为了维护两个前缀和 我们用两个树状数组

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define int long long
    using namespace std;
    int n,m,k,x,y;
    int l[1000050],r[1000050];
    int lowbit(int x)
    {
        return x&(-x);
    }
    void addl(int i,int x)
    {
        while(i<=n)
        {
            l[i]+=x;
            i+=lowbit(i);
        }
    }
    void addr(int i,int x)
    {
        while(i<=n)
        {
            r[i]+=x;
            i+=lowbit(i);
        }
    }
    int queryl(int i)
    {
        int res=0;
        while(i>=1)
        {
            res+=l[i];
            i-=lowbit(i);
        }
        return res;
    }
    int queryr(int i)
    {
        int res=0;
        while(i>=1)
        {
            res+=r[i];
            i-=lowbit(i);
        }
        return res;
    }
    signed main()
    {
        scanf("%lld%lld",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%lld%lld%lld",&k,&x,&y);
            if(k==1)
            {
                addl(x,1);
                addr(y,1);
            }
            if(k==2)printf("%lld
    ",queryl(y)-queryr(x-1));
        }
        return 0;
    }
    /*====年轻人,瞎搞是出不了省一的,这就是现实====*/
  • 相关阅读:
    python中的system函数与编码
    使用signal、setjmp、longjmp进行Linux/Android C异常处理
    ffffffuzzzzzzzzzzzzing
    EIGRP汇总
    JDK
    世界上最健康的生活方式
    Oracle 取两个表中数据的交集并集差异集合
    信息科技风险管理
    BPDU与PortFast
    大胆发言
  • 原文地址:https://www.cnblogs.com/qxds/p/11460765.html
Copyright © 2011-2022 走看看