zoukankan      html  css  js  c++  java
  • P3948 数据结构 差分数组

    题目描述

    蒟蒻Edt把这个问题交给了你 ———— 一个精通数据结构的大犇,由于是第一题,这个题没那么难。。

    edt 现在对于题目进行了如下的简化:

    最开始的数组每个元素都是0

    给出nn,optopt,modmod,minmin,maxmax,modmod在int范围内

    操作AA,QQ

    AA: LL,RR,XX 表示把[l,R][l,R]这个区间加上XX

    (数组的从L到R的每个元素都加上X)

    QQ: LL,RR 表示询问[L,R][L,R]这个区间中元素T满足 min<=(T*imin<=(Ti%mod)<=maxmod)<=max 的 T这样的数的个数(i是数组下标)

    (元素的值*数组下标%mod在min到max范围内)

    由于 edt 请来了一位非三次元的仓鼠,他帮你用延后了部分问题,将这些询问打入了混乱时空,你的询问操作不会超过1000次,不幸的是,对于延后的询问操作可能有很多次(小于1e7次),但是保证这些延后的询问操作之后不会再次有修改操作

    (就是在最后会有很多次询问,但不会进行修改)

    输入输出格式

    输入格式:

    给出n,opt,mod,min,max表示序列大小,操作次数,取膜,最小值,最大值

    下面opt行,给出

    AA: LL,RR,XX表示区间加,保证X在int范围内(<2147483647)

    QQ:LL,RR表示区间查询满足条件的个数

    再给出一个FinalFinal值,表示后面有FinalFinal个询问

    下面FinalFinal行,给出

    LL,RR表示询问区间[L,R][L,R]表示询问[L,R][L,R]之间满足条件的个数

    输出格式:

    每行对于每个QQ操作输出QQ个数表示每次询问的值,

    下面FinalFinal行表示FinalFinal个询问的值

    用差分数组还是比较简单的   

    注意开longlong

    //#include<bits/stdc++.h>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<map>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define pb push_back
    #define CLR(A,v)  memset(A,v,sizeof A)
    #define inf 0x3f3f3f3f
    #define lson l,m,pos<<1
    #define rson m+1,r,pos<<1|1
    //////////////////////////////////////
    const int N=3e6+5;
    ll differ[N],m,n,minn,maxx,mod,a,b,c,d[N],q,ans[N];
    char s[2];
    
    int main()
    {
        cin>>n>>m>>mod>>minn>>maxx;
        rep(i,1,m)
        {
            RS(s);
            if(s[0]=='A'){scanf("%lld%lld%lld",&a,&b,&c);differ[a]+=c;differ[b+1]-=c;}
            else
            {
                scanf("%lld%lld",&a,&b);int cnt=0;
                rep(i,1,b){d[i]=d[i-1]+differ[i];if(i>=a&&i<=b&& d[i]*i%mod>=minn&&d[i]*i%mod<=maxx)cnt++;}
                cout<<cnt<<endl;
            }
        }
        rep(i,1,n)d[i]=d[i-1]+differ[i];
        rep(i,1,n)
        if(d[i]*i%mod>=minn&&d[i]*i%mod<=maxx)ans[i]=ans[i-1]+1;
        else ans[i]=ans[i-1];
    
        RI(q);
        while(q--)
        {
             RII(a,b);cout<<ans[b]-ans[a-1]<<endl;
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    【转】大数据求职者说
    【转】大数据东西辣么多,我该如何给自己一个清晰的定位呢?
    【转】大数据工程师需要学习哪些?
    【English】 Re-pick up English for learning big data (not updated regularly)
    【spark】spark应用(分布式估算圆周率+基于Spark MLlib的贷款风险预测)
    【idea】scala&sbt+idea+spark使用过程中问题汇总(不定期更新)
    【idea】scala&sbt+idea安装配置与测试
    spring boot热部署
    网段判断
    【转】python测试框架--doctest
  • 原文地址:https://www.cnblogs.com/bxd123/p/10922210.html
Copyright © 2011-2022 走看看