zoukankan      html  css  js  c++  java
  • 洛谷U5653 宋荣子的小饼干

    题目描述

    楼下机房的LYL有n个妹子,分别编号为a1,a2……an,每个妹子都拥有一定数量的小饼干。有一天,saruka没有吃晚饭,饿的不要不要的,这时,他忽然想起了LYL的妹子们有小饼干可以吃。于是,saruka就去找LYL。不过LYL并不想让saruka轻易地从自己的妹子们手中拿走小饼干,于是,LYL就给saruka出了一道题,如果saruka可以做对,就把小饼干给saruka。可是saruka已经饿的辣眼睛了,根本没有力气再来做题了,你能来帮一帮saruka嘛?题目是这样的,你要进行两种操作,一种操作是代替LYL给区间[a,b]的妹子们每人发一定数量的小饼干,另一种操作是查询一下区间[a,b]的妹子们一共拥有多少块小饼干。

    输入输出格式

    输入格式:

    第一行有两个整数n和q,分别表示LYL的妹子的数量和要进行的操作的次数。

    第二行有n个数,表示初始状态下每个妹子拥有的小饼干数。

    接下来的q行,每行有一个操作:

    “C a b c”表示给区间[a,b]的妹子们每人发c块小饼干;

    “Q a b”表示查询一下区间[a,b]的妹子们一共有多少小饼干。

    输出格式:

    一共有Q行,每行一个整数,表示妹子们有的饼干数(也就是只用输出操作Q的结果)。

    输入输出样例

    输入样例#1:
    10 5
    1 2 3 4 5 6 7 8 9 10
    Q 4 4
    Q 1 10
    Q 2 4
    C 3 6 3
    Q 2 4
    输出样例#1:
    4
    55
    9
    15

    说明

    1 ≤ n,q ≤ 100000

    0 ≤ ai ≤ 1000000000

    -10000 ≤ C ≤ 10000

    请注意,C的值可以为负,也就是说LYL可以从妹子手中拿走小饼干。这个家伙!!

    因为题面很有趣就写了。

    实际上是裸的线段树区间修改

     1 /*by SilverN*/
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #define ls l,mid,rt<<1
     8 #define rs mid+1,r,rt<<1|1
     9 #define LL long long
    10 using namespace std;
    11 const int mxn=100010;
    12 struct node{
    13     LL sum;
    14     LL mk;
    15 }t[mxn<<2];
    16 LL data[mxn];
    17 int n,q;
    18 void update(int l,int r,int rt){
    19     if(l==r){t[rt].mk=0;return;}
    20     int mid=(l+r)>>1;
    21     t[rt<<1].sum+=t[rt].mk*(mid-l+1);
    22     t[rt<<1|1].sum+=t[rt].mk*(r-mid);
    23     t[rt<<1].mk+=t[rt].mk;
    24     t[rt<<1|1].mk+=t[rt].mk;
    25     t[rt].mk=0;
    26     return;
    27 }
    28 void Build(int l,int r,int rt){
    29     if(l==r){
    30         t[rt].sum=data[l];
    31         t[rt].mk=0;
    32         return;
    33     }
    34     int mid=(l+r)>>1;
    35     Build(ls);
    36     Build(rs);
    37     t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;
    38     return;
    39 }
    40 void change(int L,int R,LL v,int l,int r,int rt){
    41     if(L<=l && r<=R){
    42         t[rt].mk+=v;
    43         t[rt].sum+=v*(r-l+1);
    44         return;
    45     }
    46     int mid=(l+r)>>1;
    47     if(t[rt].mk)update(l,r,rt);
    48     if(L<=mid)change(L,R,v,ls);
    49     if(R>mid)change(L,R,v,rs);
    50     t[rt].sum=t[rt<<1].sum+t[rt<<1|1].sum;
    51     return;
    52 }
    53 LL query(int L,int R,int l,int r,int rt){
    54     if(L<=l && r<=R){
    55         return t[rt].sum;
    56     }
    57     int mid=(l+r)>>1;
    58     LL res=0;
    59     if(t[rt].mk)update(l,r,rt);
    60     if(L<=mid)res+=query(L,R,ls);
    61     if(R>mid)res+=query(L,R,rs);
    62     return res;
    63 }
    64 int main(){
    65     scanf("%d%d",&n,&q);
    66     int i,j;
    67     for(i=1;i<=n;i++)scanf("%d",&data[i]);
    68     Build(1,n,1);
    69     char op[3];int x,y;LL c;
    70     while(q--){
    71         scanf("%s",op);
    72         if(op[0]=='Q'){
    73             scanf("%d%d",&x,&y);
    74             printf("%lld
    ",query(x,y,1,n,1));
    75         }
    76         else{
    77             scanf("%d%d%lld",&x,&y,&c);
    78             change(x,y,c,1,n,1);
    79         }
    80     }
    81     return 0;
    82 }
  • 相关阅读:
    bitmap解码
    好用的dos命令
    Navicat Premium 12.0.18 / 12.0.24安装与激活
    Linux基本概念与常用命令
    Hbuilder+MUI(一)
    VS2015 运行项目报错“无可用源”,无法加载“C:WindowsMicrosoft.NETassemblyGAC_MSILSystem.Netv4.0_4.0.0.0__b03f5f7f11d50a3aSystem.Net.dll”这类型错误
    报错:找到了与该请求匹配的多个操作
    ACCESS迁移到SQLSERVE的两种方法
    C# 调用HTTP接口两种方式Demo
    转:WebApi(二)
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6047547.html
Copyright © 2011-2022 走看看