【题目描述】

一个长度为n的序列,一开始序列数的权值都是0,有m次操作

支持两种操作,

1 L R x,给区间[L,R]内,第一个数加x,第二个数加22⋅x,第三个数加32⋅x...第R-L+1个数加(R−L+1)^2⋅x

2 L R 查询区间[L,R]内的权值和

每次询问的答案对264取模

【输入格式】

第一行两个数n,m,表示序列长度和操作次数

接下来m行,每行描述一个操作,有如下两种情况:

1 L R x,给区间[L,R]内,第一个数加x,第二个数加22⋅x,第三个数加32⋅x...第R-L+1个数加(R−L+1)^2⋅x

2 L R 查询区间[L,R]内的权值和

【输出格式】

为了减少输出,你只需要输出所有答案对2^64取膜之后的异或和。

【样例输入】

5 5

1 3 4 1

2 1 5

2 2 2

1 3 3 1

1 2 4 1

【样例输出】

5

【提示】

对于10%的数据 n,m<=2000

对于30%的数据 n,m<=10000

对于100%的数据,n,m<=100000,1<=L<=R<=n,0<=x<=109

小技巧:对2^64取膜可以使用unsigned long long 的自然溢出

为了卡上榜使用标记永久化

我们先拆开(i-(L-1))^2⋅x,变成

i^2x - 2i(l+1)x + (L-1)^2*x

再变成

i^2x + 2i(1-l)x + (L-1)^2*x

接着,我们发现,第三项是一个常数项

第二项i的次数是1,第一项i的次数是2

我们就预处理i的前缀和和i*i的前缀和

于是我们开3个lazy数组,第一个保存 x ,第二个保存 2(1-l)x ,第三个保存常数(L-1)^2*x

在查询的时候,把lazy1的数字乘上i*i的前缀和,第二个乘上i的前缀和,第三个直接乘区间长度

由于是标记永久化,我们计算完标记的贡献之后还要加上两个儿子的贡献

解。

#include<bits/stdc++.h>
#define ll unsigned long long
#define inf 0x7fffffff
#define maxn 200009
#define mid ((l+r)>>1)
using namespace std;
int n,m,cnt;
int ls[maxn],rs[maxn];
ll S1[maxn],S2[maxn];
ll ans=0;
ll lz0[maxn],lz1[maxn],lz2[maxn],sum[maxn];
void Build(int &rt,int l,int r)
{
if(rt==0)rt=++cnt;
if(l==r)return;
Build(ls[rt],l,mid),Build(rs[rt],mid+1,r);
}
void Add(int rt,int l,int r,int s,int t,ll x2,ll x1,ll x0)
{
if(s>r||t<l)return;
if(s<=l&&r<=t)
{
lz2[rt]+=x2,lz1[rt]+=x1,lz0[rt]+=x0;
sum[rt]=sum[ls[rt]]+sum[rs[rt]]+lz2[rt]*(S2[r]-S2[l-1])+lz1[rt]*(S1[r]-S1[l-1])+lz0[rt]*(r-l+1);
return;
}
Add(ls[rt],l,mid,s,t,x2,x1,x0);
Add(rs[rt],mid+1,r,s,t,x2,x1,x0);
sum[rt]=sum[ls[rt]]+sum[rs[rt]]+lz2[rt]*(S2[r]-S2[l-1])+lz1[rt]*(S1[r]-S1[l-1])+lz0[rt]*(r-l+1);
}
ll Sum(int rt,int l,int r,int s,int t)
{
if(s>r||t<l)return 0;
if(s<=l&&r<=t)return sum[rt];
int LL=max(l,s),RR=min(r,t);//交叉区间
return Sum(ls[rt],l,mid,s,t)+Sum(rs[rt],mid+1,r,s,t)+lz2[rt]*(S2[RR]-S2[LL-1])+lz1[rt]*(S1[RR]-S1[LL-1])+lz0[rt]*(RR-LL+1);
}
int RT;
signed main()
{
freopen("rneaty.in","r",stdin);
freopen("rneaty.out","w",stdout);
scanf("%d%d",&n,&m);
Build(RT,1,n);
for(int i=1;i<=n;i++)S1[i]=S1[i-1]+i,S2[i]=S2[i-1]+i*1ull*i;
while(m--)
{
int cz,l,r;
scanf("%d%d%d",&cz,&l,&r);
if(cz==1)
{
ll x;
scanf("%llu",&x);
Add(1,1,n,l,r,x,x*2*(1ull-l),(l-1)*x*(l-1));
//i^2*x + i*2(1-L)*x +(L-1)^2*x
}else
{
ans^=Sum(1,1,n,l,r);
}
}
printf("%llu\n",ans);
return 0;
}

COGS 2633. [HZOI 2016] 数列操作e的更多相关文章

  1. cogs 2632. [HZOI 2016] 数列操作d

    2632. [HZOI 2016] 数列操作d ★★★   输入文件:segment.in   输出文件:segment.out   简单对比时间限制:3 s   内存限制:512 MB [题目描述] ...

  2. 2018.08.04 cogs2633. [HZOI 2016]数列操作e(线段树)

    传送门 支持区间加w(i−ql+1)2" role="presentation" style="position: relative;">w(i ...

  3. 2018.07.30 cogs2632. [HZOI 2016] 数列操作d(线段树)

    传送门 线段树基本操作 区间加等差数列,维护区间和. 对于每个区间维护等差数列首项和公差,易证这两个东西都是可合并的,然后使用小学奥数的知识就可以切掉这题. 代码: #include<bits/ ...

  4. COGS 2416.[HZOI 2016]公路修建 & COGS 2419.[HZOI 2016]公路修建2 题解

    大意: [HZOI 2016]公路修建 给定一个有n个点和m-1组边的无向连通图,其中每组边都包含一条一级边和一条二级边(连接的顶点相同),同一组边中的一级边权值一定大于等于二级边,另外给出一个数k( ...

  5. cogs——2478. [HZOI 2016]简单的最近公共祖先

    2478. [HZOI 2016]简单的最近公共祖先 ★☆   输入文件:easy_LCA.in   输出文件:easy_LCA.out   简单对比时间限制:2 s   内存限制:128 MB [题 ...

  6. COGS 2199. [HZOI 2016] 活动投票

    2199. [HZOI 2016] 活动投票 ★★   输入文件:hztp.in   输出文件:hztp.out   简单对比时间限制:0.5 s   内存限制:2 MB [题目描述] 衡中活动很多, ...

  7. COGS 2485. [HZOI 2016]从零开始的序列

    2485. [HZOI 2016]从零开始的序列 ★★   输入文件:sky_seq.in   输出文件:sky_seq.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] ...

  8. COGS 2334. [HZOI 2016]最小函数值

    时间限制:1 s   内存限制:128 MB [题目描述] 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Aix2+Bix+Ci(x∈N∗).给定这些Ai.Bi和Ci,请求出所有函数的所 ...

  9. cogs——2419. [HZOI 2016]公路修建2

    2419. [HZOI 2016]公路修建2 ★☆   输入文件:hzoi_road2.in   输出文件:hzoi_road2.out   简单对比时间限制:1 s   内存限制:128 MB [题 ...

随机推荐

  1. Maven项目转化出WebContent风格的目录

    这篇文章已被废弃. 现在,Deolin已经比较熟悉Maven,完全可以使用Jetty插件调试.热部署项目了. 在 [SpringMVC框架下Web项目的搭建与部署] 中,提到了将tomcat的默认上下 ...

  2. 注解之@RequestParam和@GetMapping

    @RequestParam用来处理Content-Type 为 application/x-www-form-urlencoded编码的内容,将请求参数名映射到方法参数名.在Http协议中,如果不指定 ...

  3. 虚拟机安装WIN7教程

    1.去下载win7原装镜像,推荐去官方网站下载:https://msdn.itellyou.cn/ 也可以直接使用Win7系统和激活工具链接:https://pan.baidu.com/s/1SJSE ...

  4. AGC009C Division into Two

    题意 有\(n\)个严格升序的数,请你分成两个集合\(A\)和\(B\),其中一个集合任意两数之差不小于\(x\),另一集合任意两数之差不小于\(y\). 问方案数,集合可以为空. $n \le 10 ...

  5. Servlet中接收和返回数据

    public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest re ...

  6. mysql.zip版本的安装教程

    MySQL zip版本安装 一直以来都习惯了使用MySQL安装文件(.exe),今天下载了一个.zip版本的MySQL,安装过程中遇到了一些问题,如下: 1.在MySQL官网上(http://dev. ...

  7. Windows Server 2008 R2 服务器内存使用率过高几乎耗光

    系统环境: Windows Server 2008 R2 Enterprise 搭建有 web服务器(iis) 和  文件服务   问题描述: Windows Server 2008 R2系统内存耗光 ...

  8. 互联网IT当线上出现 bug 时,是怎么处理的?

    线上BUG说处理方法:1.关于线上BUG问题,目前公司有一整套线上故障流程规范,包括故障定义.定级.处理流程.故障处理超时升级机制.故障处理小组.故障处罚(与故障存在时长有关)等:2.最主要的是,线上 ...

  9. 五一 DAY 5

    五一  DAY 5 V  点  1----n E  边 /* Given a graph with N nodes and M unidirectional edges. Each edge e_i ...

  10. 解决jenkins日志爆满 DNS查询错误

    一.故障 公司的jenkins因为日志量太大把磁盘占满,进而影响了其他程序,仔细一看日志文件"/var/log/jenkins/jenkins.log"几分钟产生了30G的日志 日 ...