zoukankan      html  css  js  c++  java
  • 【NOIP模拟赛】飞(fly) 数论+树状数组

    树状数组
    一个被发明以来广为流行的数据结构,基于数组,核心是lowerbit()操作。
    他向前lowerbit()操作为前缀,向后lowerbit()操作为上辖,我们运用树状数组都是使一个由O(1)变为O(log),一个由O(n)变为O(log),有两种类型一种是上辖修改前缀查询,典型的为前缀和,前缀最值,一种是前缀修改上辖查询,典型为前缀染色。
    其他的操作一般都是建立在他们的基础上或者与之类似。
    我们还可以把向前lowerbit()操作为上辖,向后lowerbit()操作为后缀,这样就可以把之前的前缀操作改为后缀操作。
    树状数组的多维扩展也是应用广泛,但应用最多为二维,其他维数根据需要有不同的用处。

    #include <cstdio>
    const int N=100010;
    int t[N],n,st,a,mod,num,temp,step,s;
    long long ans;
    inline int Q(int pos){
        int ret=0;
        for(;pos>0;pos-=pos&(-pos))
            ret+=t[pos];
        return ret;
    }
    inline void U(int pos){
        for(;pos<=a;pos+=pos&(-pos))++t[pos];
    } 
    int main(){
        register int now;
        scanf("%d%d%d%d",&n,&st,&a,&mod),now=st,step=0;int i;
        for(i=1;i<=n&&now<mod;++i)now+=a;now%=mod;
        for(;i<=n;++i){
            temp=(now>st?(now-st)/a+1:0)+s*(step+1)+(num-s)*step-1;
            if(now<a)++s,U(now+1),++num,++temp;
            now=(now+a)%mod;
            if(now<a)step=-1,s=Q(now+1);
            ans+=i-1-temp,++step;
        }
        printf("%lld",ans);
    }
  • 相关阅读:
    Balanced Binary Tree
    Swap Nodes in Pairs
    Reverse Nodes in k-Group
    Reverse Linked List II
    Remove Nth Node From End of List
    Remove Duplicates from Sorted List II
    Remove Duplicates from Sorted List
    Partition List
    Merge Two Sorted Lists
    【Yii2.0】1.2 Apache检查配置文件语法
  • 原文地址:https://www.cnblogs.com/TSHugh/p/7597702.html
Copyright © 2011-2022 走看看