题解 | 算法竞赛进阶指南 小Z的袜子

C-小Z的袜子_0x44 数据结构进阶-分块

https://ac.nowcoder.com/acm/contest/1034/C

思路

莫队基础题.
对于每个区间,设颜色的出现次数为,答案就是,分子的意义是任意选两只袜子,颜色相同的对数(可重复选,与顺序有关)减去重复选同一只的情况.
莫队维护.
加入一个数,减去加入前该数出现次数的平方,加上加入后该数出现次数的平方,删去一个数则恰恰相反.
因为是以前写的代码,计算时分子分母先除了个2(表示与顺序无关),事实上是不用的.

代码

#include<bits/stdc++.h>
using namespace std;
#define open(s) freopen( s".in", "r", stdin ), freopen( s".out", "w", stdout )
#define MAXN 50005
#define LL long long

LL N, M;
LL C[MAXN];
LL s[MAXN];

LL gcd( LL x, LL y ){
    if ( y == 0 ) return x;
    return gcd( y, x % y );
}

struct ppp{
    LL l, r, id, ans;
    void print(){
        if ( l == r || ans <= 0 ){ printf( "0/1\n" ); return; }
        LL x(ans), y( ( ( r - l + 1 ) * ( r - l ) ) >> 1 ), t; t = gcd( y, x );
        x /= t; y /= t; printf( "%lld/%lld\n", x, y );
    }
}q[MAXN];

LL B(222);
inline LL GetBlock( LL x ){ return ( x - 1 ) / B; }

bool cp( ppp x, ppp y ){
    if ( GetBlock( x.l ) == GetBlock( y.l ) ) return x.r < y.r;
    return GetBlock( x.l ) < GetBlock( y.l );
}
bool cmp( ppp x, ppp y ){ return x.id < y.id; }

int main(){
    scanf( "%lld%lld", &N, &M );
    for ( LL i = 1; i <= N; ++i ) scanf( "%lld", &C[i] );
    for ( LL i = 1; i <= M; ++i ) scanf( "%lld%lld", &q[i].l, &q[i].r ), q[i].id = i;
    sort( q + 1, q + M + 1, cp );

    int l(1), r(1); s[C[1]]++;
    LL c(1);
    for ( LL i = 1; i <= M; ++i ){
        if ( q[i].l == q[i].r ) continue;
        while( r < q[i].r ) r++, c = c - s[C[r]] * s[C[r]] + ( s[C[r]] + 1 ) * ( s[C[r]] + 1 ), s[C[r]]++;
        while( r > q[i].r ) c = c - s[C[r]] * s[C[r]] + ( s[C[r]] - 1 ) * ( s[C[r]] - 1 ), s[C[r]]--, r--;
        while( l < q[i].l ) c = c - s[C[l]] * s[C[l]] + ( s[C[l]] - 1 ) * ( s[C[l]] - 1 ), s[C[l]]--, l++;
        while( l > q[i].l ) l--, c = c - s[C[l]] * s[C[l]] + ( s[C[l]] + 1 ) * ( s[C[l]] + 1 ), s[C[l]]++;
        q[i].ans = ( c - q[i].r + q[i].l - 1 ) >> 1;
    }

    sort( q + 1, q + M + 1, cmp );

    for ( int i = 1; i <= M; ++i ) q[i].print();
    return 0;
}
全部评论

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务