• 洛谷 U14472 数据结构【比赛】 【差分数组 + 前缀和】


    题目描述

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

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

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

    给出nnnoptoptoptmodmodmodminminminmaxmaxmaxmodmodmod在int范围内

    操作AAAQQQ

    AAA: LLL,RRR,XXX 表示把[l,R][l,R][l,R]这个区间加上XXX

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

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

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

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

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

    输入输出格式

    输入格式:

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

    下面opt行,给出

    AAA: LLLRRRXXX表示区间加,保证X在int范围内(<2147483647)

    QQQLLLRRR表示区间查询满足条件的个数

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

    下面FinalFinalFinal行,给出

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

    输出格式:

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

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

    输入输出样例

    输入样例#1: 复制
    3 2 4 0 2
    A 1 3 5
    Q 2 3 
    5
    1 3
    2 3
    1 1 
    2 2 
    3 3
    
    输出样例#1: 复制
    1
    2
    1
    1
    1
    0
    
    输入样例#2: 复制
    17 25 4098 310 2622
    A 10 16 657212040
    A 4 15 229489140
    A 1 2 -433239891
    A 3 12 532385784
    A 10 17 56266644
    A 8 10 10038874
    A 6 9 13084764
    A 4 5 -9206340
    Q 2 8
    A 2 4 -43223955
    A 6 9 31478706
    A 2 4 189818310
    A 2 8 179421180
    A 2 8 40354938
    Q 8 14
    A 3 6 57229575
    A 6 13 132795740
    A 2 17 14558022
    A 14 15 -552674185
    A 5 11 -1104138
    Q 2 12
    Q 1 14
    A 3 9 524902182
    A 8 12 114291440
    A 3 7 107531442
    1
    11 12
    
    输出样例#2: 复制
    3
    6
    7
    8
    2
    
    输入样例#3: 复制
    20 3 4317 1020 2232
    A 8 15 -434078222
    A 1 2 54988154
    A 13 19 81757858
    15
    7 11
    3 5
    3 9
    6 9
    9 13
    6 19
    1 20
    3 5
    3 10
    1 7
    2 14
    6 10
    2 3
    2 3
    10 12
    
    输出样例#3: 复制
    0
    0
    0
    0
    0
    2
    2
    0
    0
    0
    0
    0
    0
    0
    0
    

    说明

    样例说明

    给出样例1的解释:

    样例1中,aaa数组修改为555555555

    每个a[i]ia[i]*ia[i]i%444 的值为111,222,333

    对于Final的询问

    询问[1[1[13]3]3]中大于等于0小于等于2的个数为2个

    剩下的询问类似

    题目说明

    注意

    1.关于负数取模问题,请以 c++ 的向0取整为标准,即如:

    [ 7 -7 7%3=1 3 = -1 3=1 ] [ 7 7 7%3=1 3 = 1 3=1 ]

    2.一共会有50个测试点,每个点分值为2分。

    因为测试点数较多,请oier们自觉地不要故意多次提交来卡评测机,出题人 edt 在这里表示由衷的感谢

    数据范围

    如果你不能作对所有点,请尝试获得部分分,所有数据都是随机生成

    img



    题解

    QAQ比赛设置在下午2:00~5:30 我们下午上课啊QAQ
    下课立刻冲过来,还好A了这道题

    乍一看题目很长很吓人,数据很大很吓人,还打着数据结构的旗号。。。这真的是T1么TAT
    冷静想想,开始的修改10^6次,询问1000次,之后全是询问,而且有10^7次
    除了那1000次询问外,其他所有的操作必须得O(1)

    这就很好想了,既然只有1000次询问,暴力算就好了
    O(1)的修改,莫不是查分数组
    O(1)的区间查询,莫不是前缀和
    ——————————————————
    先用差分数组维护修改,每当遇到一次询问就求一次前缀和更新原数组并统计答案

    待所有修改结束后,我们用一个前缀数组sum[i]表示前i个数有几个符合条件,
    每次询问就是sum[r] - sum[l - 1]
    O(1)就可以完成

    还有一点要注意的是。。中途不能取模,会影响到最后答案,所以用long long int储存过程不取模

    这样就A啦~~

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define LL long long int
    #define REP(i,n) for (int i = 1; i <= (n); i++)
    #define fo(i,x,y) for (int i = (x); i <= (y); i++)
    #define Redge(u) for (int k = head[u]; k != -1; k = edge[k].next)
    using namespace std;
    const int maxn = 80005,maxm = 100005,INF = 1000000000;
    
    inline LL read(){
    	LL out = 0,flag = 1;char c = getchar();
    	while (c < 48 || c > 57) {if (c == '-') flag = -1; c = getchar();}
    	while (c >= 48 && c <= 57) {out = out * 10 + c - 48; c = getchar();}
    	return out * flag;
    }
    
    LL n,T,P,gmin,gmax,A[maxn],D[maxn];
    
    void init(){
    	n = read(); T = read(); P = read(); gmin = read(); gmax = read();
    }
    
    void solve(){
    	char cmd;
    	LL l,r,x,sum,cnt,t;
    	while (T--){
    		cmd = getchar();
    		while (cmd != 'A' && cmd != 'Q') cmd = getchar();
    		l = read(); r = read();
    		if (cmd == 'A'){
    			x = read();
    			D[l] = D[l] + x;
    			D[r + 1] = D[r + 1] - x;
    		}else {
    			cnt = sum = 0;
    			REP(i,n){
    				sum = sum + D[i]; D[i] = 0;
    				A[i] = A[i] + sum;
    				if (i >= l && i <= r){
    					t = A[i] * i % P;
    					if (t >= gmin && t <= gmax) cnt++;
    				}
    			}
    			printf("%lld
    ",cnt);
    		}
    	}
    	cnt = sum = 0;
    	REP(i,n){
    		sum = sum + D[i];
    		A[i] = A[i] + sum;
    		t = A[i] * i % P;
    		if (t >= gmin && t <= gmax) cnt++;
    		D[i] = cnt;
    	}
    	T = read();
    	while (T--){
    		l = read();
    		r = read();
    		printf("%lld
    ",D[r] - D[l - 1]);
    	}
    }
    
    int main()
    {
    	init();
    	solve();
    	return 0;
    }
    

  • 相关阅读:
    springmvc两种非注解的处理器适配器
    springmvc两种非注解的处理器映射器
    java线程数据交换Exchanger
    java计数器CountDownLatch
    java路障CyclicBarrier
    java线程condition
    java模拟数据库缓存
    java中的递归
    面向对象
    全概率公式和贝叶斯准则
  • 原文地址:https://www.cnblogs.com/Mychael/p/8282848.html
Copyright © 2020-2023  润新知