zoukankan      html  css  js  c++  java
  • CF438D The Child and Sequence

    题意大意

    给定数列,区间查询和,区间取模,单点修改。

    (n),(m)小于(10^5)

    题目描述

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at him. A lot of important things were lost, in particular the favorite sequence of Picks.

    Fortunately, Picks remembers how to repair the sequence. Initially he should create an integer array (a[1],a[2],...,a[n]). Then he should perform a sequence of mm operations. An operation can be one of the following:

    1. Print operation (l,r) . Picks should write down the value of .
    2. Modulo operation (l,r,x) . Picks should perform assignment (a[i]=a[i] mod x) for each (i) ((l<=i<=r)).
    3. Set operation (k,x) . Picks should set the value of (a[k]) to (x) (in other words perform an assignment (a[k]=x)).

    Can you help Picks to perform the whole sequence of operations?

    输入输出格式

    输入格式:

    The first line of input contains two integer: (n,m) ((1<=n,m<=10^{5})) . The second line contains nnintegers, separated by space: (a[1],a[2],...,a[n] (1<=a[i]<=10^{9})) — initial value of array elements.

    Each of the next mm lines begins with a number typetype .

    • If (type=1) , there will be two integers more in the line: (l,r (1<=l<=r<=n)) , which correspond the operation (1).
    • If (type=2) , there will be three integers more in the line: (l,r,x (1<=l<=r<=n; 1<=x<=10^{9})) , which correspond the operation (2).
    • If (type=3), there will be two integers more in the line: (k,x (1<=k<=n; 1<=x<=10^{9})) , which correspond the operation (3).

    输出格式:

    For each operation (1), please print a line containing the answer. Notice that the answer may exceed the (32)-bit integer.

    输入输出样例

    输入样例#1:

    5 5
    1 2 3 4 5
    2 3 5 4
    3 3 5
    1 2 5
    2 1 3 3
    1 1 3
    

    输出样例#1:

    8
    5
    

    输入样例#2:

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

    输出样例#2:

    49
    15
    23
    1
    9
    

    说明

    Consider the first testcase:

    • At first, a={1,2,3,4,5}.
    • After operation 1 , a={1,2,3,0,1}.
    • After operation 2 , a={1,2,5,0,1}.
    • At operation 3 , 2+5+0+1=8.
    • After operation 4 , a={1,2,2,0,1}.
    • At operation 5 , 1+2+2=5.

    思路:

    题目大意:给定数列,区间查询和,区间取模,单点修改。

    (n,m)小于(10^5)

    查询区间和和单点修改就不用说了吧,线段树基本操作,那??对于这道题目的区间修改该怎么处理呢??不难发现,一个数模两次同样的数时没有任何意义的,而且一个数模一个比它大的数也是没有意义的?!!!那么,我们便可以采用一种暴力的思想,去修改每一个位置,每次判断一下区间最大值是不是比模数大即可。因为是暴力修改,所以也无需(pushdown),那么代码应该就很好写了吧,也不算太长。

    自己整理的题解

    下面是我的代码,仅供参考,毕竟太丑了

    #include<cstdio>
    #include<algorithm>
    #include<cctype>
    #define maxn 100007
    #define ls rt<<1
    #define rs rt<<1|1
    #define ll long long
    using namespace std;
    int n,m,maxx[maxn<<2];
    ll sum[maxn<<2];
    inline int qread() {
      char c=getchar();int num=0,f=1;
      for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
      for(;isdigit(c);c=getchar()) num=num*10+c-'0';
      return num*f;
    }
    inline void pushup(int rt) {
      sum[rt]=sum[ls]+sum[rs];
      maxx[rt]=max(maxx[ls],maxx[rs]);
    }
    void build(int rt, int l, int r) {
      if(l==r) {
        maxx[rt]=sum[rt]=qread();
        return;
      }
      int mid=(l+r)>>1;
      build(ls,l,mid);
      build(rs,mid+1,r);
      pushup(rt);
    }
    void add(int rt, int l, int r, int L, int val) {
      if(l==r) {
        maxx[rt]=sum[rt]=val;
        return;
      }
      int mid=(l+r)>>1;
      if(L<=mid) add(ls,l,mid,L,val);
      else add(rs,mid+1,r,L,val);
      pushup(rt);
    }
    ll csum(int rt, int l, int r, int L, int R) {
      if(L<=l&&r<=R) return sum[rt];
      int mid=(l+r)>>1;
      ll ans=0;
      if(L<=mid) ans+=csum(ls,l,mid,L,R);
      if(R>mid) ans+=csum(rs,mid+1,r,L,R);
      return ans;
    }
    void modify(int rt, int l, int r, int L, int R, int p) {
      if(maxx[rt]<p) return;
      if(l==r) {
        sum[rt]%=p;maxx[rt]%=p;
        return;
      }
      int mid=(l+r)>>1;
      if(L<=mid) modify(ls,l,mid,L,R,p);
      if(R>mid) modify(rs,mid+1,r,L,R,p);
      pushup(rt);
    }
    int main() {
      n=qread(),m=qread();
      build(1,1,n);
      for(int i=1,k,x,y,z;i<=m;++i) {
        k=qread(),x=qread(),y=qread();
        if(k==1) printf("%lld
    ",csum(1,1,n,x,y));
        if(k==2) {
          z=qread();
          modify(1,1,n,x,y,z);
        }
        if(k==3) add(1,1,n,x,y);
      }
      return 0;
    }
    
  • 相关阅读:
    班级派团队项目小计(七)
    班级派团队项目小计(六)
    班级派团队项目小计(五)
    班级派团队项目小计(四)
    班级派团队项目小计(三)
    场景描述思密达~
    班级派团队项目小计(二)
    班级派团队项目小计(一)
    构建之法阅读笔记02
    JS获取坐标
  • 原文地址:https://www.cnblogs.com/grcyh/p/10226346.html
Copyright © 2011-2022 走看看