牛客网练习赛t2(线段树)
题解:
好像因为他说了
数据范围全部在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(线段树)的更多相关文章
- 牛客网练习赛23 F 托米的游戏
		
链接:https://www.nowcoder.com/acm/contest/156/F 来源:牛客网 题目描述 题目背景编不下去了 托米有一棵有根树 T, 树根为1,每轮他会在剩下的子树中等概率一 ...
 - 牛客网练习赛28A
		
题目链接:https://www.nowcoder.com/acm/contest/200/A 链接:https://www.nowcoder.com/acm/contest/200/A来源:牛客网 ...
 - 牛客网练习赛18 A 【数论/整数划分得到乘积最大/快速乘】
		
链接:https://www.nowcoder.com/acm/contest/110/A 来源:牛客网 题目描述 这题要你回答T个询问,给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积 ...
 - 牛客网练习赛26B(简单的dp)
		
题目链接:https://www.nowcoder.com/acm/contest/180/B 链接:https://www.nowcoder.com/acm/contest/180/B来源:牛客网 ...
 - 牛客网练习赛34-D-little w and Exchange(思维题)
		
链接:https://ac.nowcoder.com/acm/contest/297/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
 - 牛客网练习赛25 C 再编号
		
链接:https://www.nowcoder.com/acm/contest/158/C来源:牛客网 定义对 a 的再编号为 a' ,满足 . 现在有 m 次询问,每次给定 x,t ,表示询问经过 ...
 - 牛客网练习赛43-C(图论)
		
题目链接:https://ac.nowcoder.com/acm/contest/548/C 题意:有n个知识点,学会每个知识点花T[i],已经学会了其中k个知识点,有m组关系,t1,t2,t3,表示 ...
 - 牛客网练习赛12---A and B
		
A题传送门:https://www.nowcoder.net/acm/contest/68/A B题传送门: https://www.nowcoder.net/acm/contest/68/B A ...
 - 牛客网练习赛7-B-购物
		
在遥远的东方,有一家糖果专卖店. 这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元. 现在的你想要在接下来的n天去糖果店进行选购,你每天可以买多个糖 ...
 
随机推荐
- git下载指定的版本
			
1.查看提交历史 sudo git log 打印如下内容: commit 2e3c19d412ab6a99bb51f338f71537a720a9c706 Author: huangbaog ...
 - springboot:扩展类型转换器
			
需求:提交一个字符串到后端的java.sql.Time类型,就报错了: Failed to convert property value of type [java.lang.String] to r ...
 - Day7--------------IP地址配置
			
ifconfig 查看网卡 ifconfig eth0 查看网卡eth0 配置网络地址: 临时配置: ifconfig eth0 192.168.10.100 netmask 255.255.255. ...
 - Python-Mongodb vs mysql
			
mongodb https://www.cnblogs.com/kermitjam/articles/10147254.html#_label5 centos安装mongodb: https://bl ...
 - linux指定只显示(只打印)文件中的某几行(中间几行)
			
[一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1000 [二]显示1000行到3000行 cat ...
 - Go语言中的byte和rune区别、对比
			
Go语言中byte和rune实质上就是uint8和int32类型.byte用来强调数据是raw data,而不是数字:而rune用来表示Unicode的code point.参考规范: uint8 t ...
 - winform无需安装pdf阅读器打开pdf文件
			
控件来源:http://www.o2sol.com/pdfview4net/download.htm (使用版本:2016年8月31号更新版) 备份链接: https://pan.baidu.com/ ...
 - Windows7上完全卸载Oracle 12c操作步骤
			
注:本文来源于:< Windows7上完全卸载Oracle 12c操作步骤 > 1.关闭Oracle所有的服务,按[win+R]运行[services.msc]找到所有Oracle开头的 ...
 - 《 Oracle查询优化改写  技巧与案例 》电子工业出版社
			
第1章单表查询 11.1 查询表中所有的行与列 11.2 从表中检索部分行 21.3 查找空值 31.4 将空值转换为实际值 41.5 查找满足多个条件的行 51.6 从表中检索部分列 61.7 为列 ...
 - 基于 Confluence 6 数据中心在你的 Atlassian  应用中配置 SAML 授权
			
希望在 Confluence 中配置SAML: Go to > 基本配置(General Configuration) > SAMl 授权(SAML Authentication). 选 ...