题解:

好像因为他说了

数据范围全部在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. Unity3D动态生成多边形

    来自https://blog.csdn.net/qq_14903317/article/details/69668521 自由绘制多边形   https://blog.csdn.net/lei_710 ...

  2. git与eclipse集成之保存快照

    1.1. 保存快照 在个分支进行编码,然后需要紧急切换到另外一个分支进行快速修复一个问题,此时可以先将当前分支的修改进行保存快照. 在分支A进行编码,保存快照 切换到另外分支B进行修改 切换回A分支继 ...

  3. oracle 12514文件解决

    listener.ora的SID_LIST_LISTENER添加一下内容 (SID_DESC = (GLOBAL_DBNAME = ORCL) (ORACLE_HOME = f:\app\Admini ...

  4. ubuntu Qt linuxdeployqt打包

    1.下载PatchELF 0.9.,https://nixos.org/patchelf.html 安装:./configure make sudo make install 2.终端命令设置设置环境 ...

  5. Linux内存使用调整

    前段时间在做播放器的时候,遇到个问题,花了很长时间,做个记录,希望对有需要的人有所帮助: 播放器的播视频的时候,无论是手动切换视频还是到视频播放完成,自动切换视频,一定次数后均出现黑屏现象,偶尔有声音 ...

  6. python学习第5天

    数据类型:字典 字典 why: 列表的缺点: 1,列表如果存储的数据比较多,那么他的查询速度相对慢. 2,列表存储的数据关联性不强. what: python基础数据类型之一:字典. python中唯 ...

  7. tcp和udp协议的聊天 和udp协议的时间同步机制-----编码

    tcp协议聊天 服务端:: 客户端 udp协议的聊天 ############ udp协议 ########### 服务器 import socket sk = socket.socket(type ...

  8. Python-socketserver实现并发- 源码分析

    基于tcp的套接字,关键就是两个循环, 一个链接循环,一个通信循环 socketserver模块中分两大类: server类(解决链接问题)和request类(解决通信问题) server类: req ...

  9. Confluence 6 通过 SSL 或 HTTPS 运行 - 修改你 Confluence 的 server.xml 文件

    下一步你需要配置 Confluence 来使用 HTTPS: 编辑 <install-directory>/conf/server.xml 文件. 取消注释下面的行: <Connec ...

  10. Confluence 6 查看索引和提示

    查看索引 Confluence 使用被称为 Lucene 的搜索引擎.如果你希望在你的 Confluence站点中查看更多有关索引的细节,你可以下载并且运行 Luke.Luke 是一个开发和诊断工具, ...