树状数组2

之前写树状数组只写了了单点修改区间查询以及区间修改单点查询.今天因为一个题目要用到树状数组区间修改区间查询,所以先更一下区间修改以及区间查询.

  • 区间修改以及区间查询呢,简单的来说区间修改还是和以前一样用一个D[i]数组单点修改即可完成.如何进行区间查询呢?这里我们用到两个数组即可完成,c1[i]表示d[i]的前缀和,c2[i]表示d[i]*(i-1)的前缀和.如此我们就可以进行区间修改以及区间查询了.c1,c2类似之前的sum数组.

https://www.luogu.com.cn/problem/P6477

直接看这个题,其实树状数组这种数据结构大多数只是一种降低时间复杂度的工具,题目的重点在于思维的过程
求不可重集的计数,大概就是推出相邻两项的关系,然后就知道了一个公式...然后就没了= - =因为不会打公式,啊,求和公式啥的都不会打..
这里的树状数组大概是维护的l区间嘛,然后扫描线的做法统计答案罗..(还是挺复杂的一个蓝题,其实我觉得跟紫题差不多...)
代码如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const ll N=1e6+5;
ll a[N],n,c1[N],c2[N],last[N],d[N],ls[N];

ll lowbit(ll x)   {  return x&(-x); }

void add(ll pos,ll val)
{
    ll x=pos;
    while(pos<=n)
    {
        c1[pos]+=val;
        c2[pos]+=(x-1)*val;
        pos+=lowbit(pos);
    }
}

ll query(ll pos)
{
    ll res=0;ll x=pos;
    while(pos)
    {
        res+=x*c1[pos]-c2[pos];
        pos-=lowbit(pos);
    }
    return res;
}

int main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++)   {scanf("%lld",&a[i]);ls[i]=a[i];}
    sort(ls+1,ls+1+n);
    int cnt=unique(ls+1,ls+1+n)-ls-1;
    for(int i=1;i<=n;i++)
    {
        a[i]=lower_bound(ls+1,ls+1+n,a[i])-ls;
        last[i]=d[a[i]];
        d[a[i]]=i;
    }
    ll ans=0,now=0;
    for(int i=1;i<=n;i++)
    {
        now+=2ll*(query(i)-query(last[i]))+i-last[i];
        now%=mod;
        ans+=now;
        ans%=mod;
        add(last[i]+1,1);
        add(i+1,-1);
    }
    printf("%lld\n",ans);
    return 0;
}
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务