题解:

好像因为他说了

数据范围全部在ll以内

所以直接暴力就可以过了

比较正常是用线段树来维护

洛谷上有道模板题是支持加,乘,区间和

而这题还多了区间平方和的操作

按照那题的操作

我们维护的时候保证先乘再加

a1^2+a2^2+a3^2

我们考虑先*x再+y 以及先+y再*x两种操作

(a1*x+y)^2+(a2*x+y)^2+(a3*x+y)^2

x*x*(a1+y)^2

于是我们维护操作的时候是这样的

平方和+=2*sum1*乘法标记*lazy值+乘法标记*乘法标记*lazy值

关键在于这个2*sum1*乘法标记*lazy值

看第一种情况展开项为2*a1*x*y 符合

第二种情况为2*x*x*a1*y  而这个我们已经对y乘了x 所以也是对的

代码:

#include <bits/stdc++.h>
using namespace std;
#define rint register int
#define IL inline
#define rep(i,h,t) for (rint i=h;i<=t;i++)
#define dep(i,t,h) for (rint i=t;i>=h;i--)
#define ll long long
#define mid ((h+t)/2)
const int N=2e4;
int a[N],n,m;
struct sgt{
ll sum[N*],sum2[N*],lazy[N*];
ll lazy3[N*];
sgt()
{
rep(i,,N*-) lazy3[i]=;
}
IL void updata(int x)
{
sum[x]=sum[x*]+sum[x*+];
sum2[x]=sum2[x*]+sum2[x*+];
}
IL void down(int x,int h,int t)
{
ll t1=sum[x*],t2=sum[x*+],t3=lazy3[x];
if (lazy3[x]!=)
{
sum[x*]*=lazy3[x];
sum[x*+]*=lazy3[x];
sum2[x*]*=lazy3[x]*lazy3[x];
sum2[x*+]*=lazy3[x]*lazy3[x];
lazy3[x*]*=lazy3[x];
lazy3[x*+]*=lazy3[x];
lazy[x*]*=lazy3[x];
lazy[x*+]*=lazy3[x];
lazy3[x]=;
}
sum2[x*]+=*t1*lazy[x]*t3+(mid-h+)*lazy[x]*lazy[x];
sum2[x*+]+=*t2*lazy[x]*t3+(t-mid)*lazy[x]*lazy[x];
if (lazy[x])
{
sum[x*]+=(mid-h+)*lazy[x];
sum[x*+]+=(t-mid)*lazy[x];
lazy[x*]+=lazy[x]; lazy[x*+]+=lazy[x];
lazy[x]=;
}
}
void build(int x,int h,int t)
{
if (h==t)
{
sum[x]=a[h]; sum2[x]=a[h]*a[h]; return;
}
build(x*,h,mid); build(x*+,mid+,t);
updata(x);
}
void add(int x,int h,int t,int h1,int t1,ll k)
{
if (h1<=h&&t<=t1)
{
lazy[x]+=k;
sum2[x]=sum2[x]+*k*sum[x]+(t-h+)*k*k;
sum[x]=sum[x]+(t-h+)*k;
return;
}
down(x,h,t);
if (h1<=mid) add(x*,h,mid,h1,t1,k);
if (mid<t1) add(x*+,mid+,t,h1,t1,k);
updata(x);
}
void change(int x,int h,int t,int h1,int t1,ll k)
{
if (h1<=h&&t<=t1)
{
lazy[x]*=k;lazy3[x]*=k;
sum2[x]=sum2[x]*k*k; sum[x]=sum[x]*k;
return;
}
down(x,h,t);
if (h1<=mid) change(x*,h,mid,h1,t1,k);
if (mid<t1) change(x*+,mid+,t,h1,t1,k);
updata(x);
}
ll query1(int x,int h,int t,int h1,int t1)
{
if (h1<=h&&t<=t1) return(sum[x]);
ll ans=;
down(x,h,t);
if (h1<=mid) ans+=query1(x*,h,mid,h1,t1);
if (mid<t1) ans+=query1(x*+,mid+,t,h1,t1);
return(ans);
}
ll query2(int x,int h,int t,int h1,int t1)
{
if (h1<=h&&t<=t1) return(sum2[x]);
ll ans=;
down(x,h,t);
if (h1<=mid) ans+=query2(x*,h,mid,h1,t1);
if (mid<t1) ans+=query2(x*+,mid+,t,h1,t1);
return(ans);
}
}S;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
rep(i,,n) cin>>a[i];
S.build(,,n);
rep(i,,m)
{
int kk,x1,x2,y;
cin>>kk;
if (kk==)
{
cin>>x1>>x2;
cout<<S.query1(,,n,x1,x2)<<endl;
}
if (kk==)
{
cin>>x1>>x2;
cout<<S.query2(,,n,x1,x2)<<endl;
}
if (kk==)
{
cin>>x1>>x2>>y;
S.change(,,n,x1,x2,y);
}
if (kk==)
{
cin>>x1>>x2>>y;
S.add(,,n,x1,x2,y);
}
}
return ;
}

牛客网练习赛t2(线段树)的更多相关文章

  1. 牛客网练习赛23 F 托米的游戏

    链接:https://www.nowcoder.com/acm/contest/156/F 来源:牛客网 题目描述 题目背景编不下去了 托米有一棵有根树 T, 树根为1,每轮他会在剩下的子树中等概率一 ...

  2. 牛客网练习赛28A

    题目链接:https://www.nowcoder.com/acm/contest/200/A 链接:https://www.nowcoder.com/acm/contest/200/A来源:牛客网 ...

  3. 牛客网练习赛18 A 【数论/整数划分得到乘积最大/快速乘】

    链接:https://www.nowcoder.com/acm/contest/110/A 来源:牛客网 题目描述 这题要你回答T个询问,给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积 ...

  4. 牛客网练习赛26B(简单的dp)

    题目链接:https://www.nowcoder.com/acm/contest/180/B 链接:https://www.nowcoder.com/acm/contest/180/B来源:牛客网 ...

  5. 牛客网练习赛34-D-little w and Exchange(思维题)

    链接:https://ac.nowcoder.com/acm/contest/297/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  6. 牛客网练习赛25 C 再编号

    链接:https://www.nowcoder.com/acm/contest/158/C来源:牛客网 定义对 a 的再编号为 a' ,满足 . 现在有 m 次询问,每次给定 x,t ,表示询问经过 ...

  7. 牛客网练习赛43-C(图论)

    题目链接:https://ac.nowcoder.com/acm/contest/548/C 题意:有n个知识点,学会每个知识点花T[i],已经学会了其中k个知识点,有m组关系,t1,t2,t3,表示 ...

  8. 牛客网练习赛12---A and B

    A题传送门:https://www.nowcoder.net/acm/contest/68/A B题传送门:   https://www.nowcoder.net/acm/contest/68/B A ...

  9. 牛客网练习赛7-B-购物

    在遥远的东方,有一家糖果专卖店. 这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元. 现在的你想要在接下来的n天去糖果店进行选购,你每天可以买多个糖 ...

随机推荐

  1. C++类的继承中构造函数和析构函数调用顺序例子

    /*当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.简而言之,对象是由“底层向上”开始构造的.因为,构造函数 ...

  2. Linux中error while loading shared libraries错误解决办法

    默认情况下,编译器只会使用/lib和/usr/lib这两个目录下的库文件,通常通过源码包进行安装时,如果不指定--prefix,会将库安装在/usr/local/lib目录下:当运行程序需要链接动态库 ...

  3. JSP错误页面处理的两种方式

    JSP错误页面处理的两种方式: 方法1(真能针对单一页面生效,不推荐): 出错页面实例 <%@ page language="java" contentType=" ...

  4. MySQL数据库的各种存储引擎详解

    原文来自:MySQL数据库的各种存储引擎详解   MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...

  5. 在Centos7 上安装SVN

    https://blog.csdn.net/crossangles_2017/article/details/78553266 1.安装 使用yum安装非常简单: yum install subver ...

  6. python 初识函数

    1.什么是函数 函数就是对一个代码块 或者功能的封装,什么时候用,什么时候执行 语法: def  函数名():            函数体(代码块) 函数的调用 函数名()          #所有 ...

  7. Go语言环境安装&搭建(Linux)

    Linux的东西果然不记不行啊~ 下载&安装 下载 我们先找到linux版的下载链接 https://golang.org/dl/ 打开网址找到Linux对应的链接右键复制下载地址 然后连接服 ...

  8. 46)django-发送邮件

    django已封装好了邮件发送功能,可以直接调用发送模块 1. 配置相关参数 如果用的是 阿里云的企业邮箱,则类似于下面: 在 settings.py 的最后面加上类似这些 EMAIL_BACKEND ...

  9. 32)django-modelform

    一:mdoelform modelform是model和form结合 model+form =>验证+数据库 class A(model): user= pass= Form: class Lo ...

  10. TIMESTAMPN(N) WITH LOCAL TIMEZONE数据类型转换

    --TYPE#=231为TIMESTAMP(N) WITH LOCAL TIME ZONE,181为TIMESTAMP(N) WITH TIME ZONEselect u.name || '.' || ...