题解:

好像因为他说了

数据范围全部在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. MFCWinInet学习

    http://blog.csdn.net/segen_jaa/article/details/6278167 背景: 功能:服务端下载文件 服务端:用Java写Sevlet进行有效性验证 客户端:用C ...

  2. vc++高级班之窗口篇[4]---让程序只运行一个实例

      大家都看过或者使用过类似只运行一个实例的程序,比如:QQ游戏.部分浏览器 等等! 让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建后,有窗口的程序在窗口创建前, 检查系统中是 ...

  3. MySQL-mysql 8.0.12安装教程

    1.下载zip安装包 去官网下载MySQL8.0 For Windows zip包,下载地址:https://dev.mysql.com/downloads/mysql/ 2.安装 解压zip包到安装 ...

  4. POJ 1305

    毕达哥斯三元组的模板题 练习练习 #include<iostream> #include<cstring> #include<cstdio> #include< ...

  5. 图解elasticsearch的_source、_all、store和index

    Elasticsearch中有几个关键属性容易混淆,很多人搞不清楚_source字段里存储的是什么?store属性的true或false和_source字段有什么关系?store属性设置为true和_ ...

  6. iOS 高德地图轨迹回放的 思路, 及方法

    // 开始,公司要求制作一段跑步轨迹 在地图上的 动画回放, 传入一段经纬度, 开始一想,这不是很简单吗, 高德地图有可以把经纬度转换成坐标点的方法 /** * @brief 将经纬度转换为指定vie ...

  7. socket-WebSocket HttpListener TcpListener 服务端客户端的具体使用案例

    /// <summary>/// 启动服务监听的ip和端口的主线程/// </summary>/// <param name="tunnelPort" ...

  8. nodejs之crypto加密算法

    示例 const crypto = require('crypto'); const hash = crypto.createHash('sha256'); hash.update('some dat ...

  9. bat如何创建多级文件夹(在android设备中)

    在android设备中要创建多个或者多级文件夹时,手动去创建费时费力(有点傻),一个bat文件就能很好的实现这个功能. 1.首先创建同级多个文件夹且在该文件夹下生成一个文件 @echo off ech ...

  10. jquery 的鼠标事件/淡入淡出/绑定

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...