• 分块随笔T1


    小Z的课堂检测

    时间限制: 1 Sec  内存限制: 128 MB
    提交: -  解决: -
    [提交][讨论版]

    题目描述

    大家都知道小Z的课总是十分快的(鬼知道为什么),然后我们阿M同学总是在上课时处于神游状态亦或是休眠状态,所以她对小Z到底讲了什么是一无所知。然而,小Z总是很坏地打断阿M的休眠状态,并问她问题。作为阿M的开黑好伙伴,你当然不希望阿M同学翻车(不然下一个回答问题的人就是你啦)。所以你需要编写个程序帮助阿M求小Z对于知识点到底讲的档次有多深。已知小Z在课上总会扯到涉及到N个知识点,小Z会进行M个动作(讲课或是提问阿M)。由于小Z比较古灵精怪,所以小Z的讲课时只会讲连续的知识点,并且对于这段区间内的知识点都提升一样的档次。而且,小Z也比较懒,所以小Z只会问阿M关于某一个知识点的了解程度。

    输入

    第一行读入N,表示小Z要涉及到N个知识点
    第二行读入A[1],A[2]……A[N-1],A[N]表示小Z上几节课已经把第i个知识点的     难度提升到A[i]的难度
    第三行读入M,表示小Z要进行M个动作
    接下来M行,读入Choice
    若Choice=1,则表示小Z要讲课啦
    接下来读入L,R,X 表示小Z要对L到R这些连续的知识点提升难度X
    若Choice=2,则表示小Z要提问啦
    接下来读入K,表示小Z问阿M第K个知识点他已经讲到哪个难度了

    输出

    每行输出一个数表示阿M应该回答的正确答案

    样例输入

    10
    1 2 3 4 5 6 7 8 9 10
    5
    1 2 3 4
    2 3
    1 3 4 5
    2 5
    1 5 8 5
    
    
    7
    5 3 7 7 5 8 5
    9
    1 2 7 -1
    2 1
    2 2
    1 2 3 1
    1 2 7 2
    2 2
    1 3 3 -1
    2 3
    2 1
    

    样例输出

    7
    5
    
    
    5
    2
    5
    8
    5
    

    提示

    数据范围

    对于50%的数据,N<=1000,M<=1000

    对于100%的数据,N<=100000,M<=100000 |X|<=50000

    |A[i]|<=50000;
     
    此题花式解,我写了树状数组
    #include<iostream> 
    #include<cstdio> 
    #include<algorithm> 
    using namespace std; 
    #define lowbit(x) x&(-x) 
    int n,m;
    long long a[100005],c1[100005],c2[100005]; 
    void update(int v,int val) 
    { 
        for(int p=v;p<=n;p+=lowbit(p)) 
        c1[p]+=val,c2[p]+=val*v; 
    } 
    long long query(int l,int r) 
    { 
        long long ans=0; 
        l--; 
        for(int p=r;p>0;ans+=(r+1)*c1[p],ans-=c2[p],p-=lowbit(p)); 
        for(int p=l;p>0;ans-=(l+1)*c1[p],ans+=c2[p],p-=lowbit(p)); 
        return(long long) ans; 
    } 
    int main() 
    { 
        scanf("%d",&n); 
        for(int i=1;i<=n;i++) 
        scanf("%d",&a[i]); 
        for(int i=1;i<=n;i++) 
        update(i,a[i]-a[i-1]); 
        scanf("%d",&m); 
        for(int i=1;i<=m;i++) 
        { 
            int x,y,tmp,val; 
            scanf("%d",&tmp); 
            scanf("%d",&x); 
              
            if(tmp==1) 
            { 
                scanf("%d %d",&y,&val); 
                update(x,val);update(y+1,-val); 
            }else
            printf("%lld
    ",query(x,x)); 
        } 
    } 
  • 相关阅读:
    Kerberos-KDC
    samba后台进程及安全模式简介
    samba服务器详细配置(非域模式)
    windows常用net use命令
    samba常用命令
    ORA-24324、ORA-12560、ORA-12514
    oracle的启动和关闭
    Oracle 监听配置详解(转载)
    linux加入windows域之完美方案(转载)
    怎样识吉他谱
  • 原文地址:https://www.cnblogs.com/dancer16/p/6908169.html
Copyright © 2020-2023  润新知