牛客网练习赛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天去糖果店进行选购,你每天可以买多个糖 ...
随机推荐
- centos6.9安装crontab
yum install vixie-cron crontabs //安装 chkconfig crond on //开机自启动 service crond start //启动 然后就是执行 cron ...
- hibernate框架学习之核心配置文件
hibernate.cfg.xml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration ...
- struts2框架之OGNL(参考第三天学习笔记)
ognl 1. 什么是ognl 对象图导航语言 Struts内置的表达式语言,它比EL要强大很多. ------------------ 2. 单独学习ognl * EL它操作的数据来自于:四大域:p ...
- OpenStack实践系列①openstack简介及基础环境部署
OpenStack实践系列①openstack简介及基础环境部署 一.OpenStack初探1.1 OpenStack简介 OpenStack是一整套开源软件项目的综合,它允许企业或服务提供者建立.运 ...
- Linux系统的命令别名功能(转)
在管理和维护Linux系统的过程中,将会使用到大量命令,有一些很长的命令或用法经常被用到,重复而频繁地输入某个很长命令或用法是不可取的.这时可以使用命令别名功能将这个过程简单化. 1.系统定义的别名通 ...
- Elasticsearch索引别名、Filtered索引别名、Template
在使用elasticsearch的时候,经常会遇到需要淘汰掉历史数据的场景. 为了方便数据淘汰,并使得数据管理更加灵活,我们经常会以时间为粒度建立索引,例如: 每个月建立一个索引:monthly-20 ...
- PHP字符串比较,看起来值完全一样,但是就是不相等的解决方案(‌)
1 前言 字符串比较,看起来完全一样,然后用strcmp比较,永远不相等,用var_dump查看才知道,其中一个字符多了看不见的特殊符号,而我长度是3. 2 样例 当你选中它,显示出来的就是人眼所见 ...
- Java jvisualvm 远程监控tomcatt
第一步 在远程tomcat 的bin目录下的start.sh 文件中添加一些内容(添加在exec "$PRGDIR"/"$EXECUTABLE" start & ...
- 分享一份非常强势的Android面试题
马上步入金九银十了,是时候看一些面试题去鹅厂了,接下来我将分享一些面试题,每天总结一点点,希望对大家有所帮助! ListView和RecyclerView区别 参考链接: https://blog.c ...
- Confluence 6 数据库表-空间(Spaces)
这个表格与空间的管理有关. spaces 有关空间使用的信息:key,空间的名称和数字 ID. https://www.cwiki.us/display/CONF6ZH/Confluence+Data ...