感觉自己做的麻烦了,但常数似乎不算差。(只是Luogu最慢的点不到2s本地要跑10+s)

感觉我的想法是最自然的,但不明白为什么网上似乎找不到这种做法。(不过当然所有的做法都是分类大讨论,而我的方法手算部分较为麻烦)

每次询问考虑每个位置的贡献,拆分成求所有长度<=R的区间的贡献次数和减去长度<L的区间贡献次数和。

分成两大类考虑,设当前考虑长度在[1,r]的所有区间,当前要计算数a[k]的贡献次数:

一: $2r\leq n$

  1.$k\leq r$ 观察所有包含k的长度不超过r的区间,发现答案为$1+2+...+i+i+i+...i=\frac{1}{2}[(2r+1)i-i^2]$

  2.$r<k<n-r+1$ 左右两边都可以延伸k的长度,于是答案为$1+2+...+r=\frac{r(r+1)}{2}$

  3.$k\geq n-r+1$ 和情况一类似,答案为$1+2+...+(n-i)+(n-i)+(n-i)+...=\frac{1}{2}[2nr-n^2-n+2r+(2n-2r+1)i-i^2]$

二:$2r>n$

  1.$k\leq n-r+1$观察发现和上面情况一是一样的:$\frac{1}{2}[(2r+1)i-i^2]$

  2.$n-r+1<k<n/2$

    答案为$1+2+...+i+i+...+i+(i-1)+(i-2)+...=\frac{1}{2}[2nr-n^2-r^2+r-n+(2n+n)i-2i^2]$

   $n/2\leq k<r$

    一波复杂的带入化简发现答案同上:$\frac{1}{2}[2nr-n^2-r^2+r-n+(2n+n)i-2i^2]$

  3.$k\geq r$ 观察发现和上面情况三是一样的:$\frac{1}{2}[2nr-n^2-n+2r+(2n-2r+1)i-i^2]$

于是分别维护$\sum a_i$,$\sum a_i*i$,$\sum a_i*i^2$即可。

 #include<cstdio>
#include<algorithm>
#define ls (x<<1)
#define rs (ls|1)
#define lson ls,L,mid
#define rson rs,mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
using namespace std; const int N=,mod=1e9+,inv2=(mod+)/,inv6=(mod+)/;
int n,m,op,l,r,x,a[N]; int rd(){
int x=; char ch=getchar(); bool f=;
while (ch<'' || ch>'') f|=(ch=='-'),ch=getchar();
while (ch>='' && ch<='') x=(x<<)+(x<<)+(ch^),ch=getchar();
return f ? -x : x;
} struct P{ int a[],tag; }v[N<<];
inline void inc(int &x,int y){ x+=y; (x>=mod)?x-=mod:; } P operator +(P a,P b){
inc(a.a[],b.a[]); inc(a.a[],b.a[]);
inc(a.a[],b.a[]); a.tag=; return a;
} int cal1(int x){ return 1ll*x*(x+)/%mod; }
int cal2(int x){ return 1ll*x*(x+)*(*x+)%mod*inv6%mod; } void put(int x,int L,int R,int k){
inc(v[x].a[],1ll*(R-L+)*k%mod);
inc(v[x].a[],1ll*(cal1(R)-cal1(L-)+mod)*k%mod);
inc(v[x].a[],1ll*(cal2(R)-cal2(L-)+mod)*k%mod);
inc(v[x].tag,k);
} void push(int x,int L,int R){
if (!v[x].tag) return;
int mid=(L+R)>>;
put(lson,v[x].tag); put(rson,v[x].tag); v[x].tag=;
} void build(int x,int L,int R){
if (L==R){
v[x].a[]=a[L]; v[x].a[]=1ll*a[L]*L%mod;
v[x].a[]=1ll*a[L]*L%mod*L%mod; return;
}
int mid=(L+R)>>;
build(lson); build(rson); v[x]=v[ls]+v[rs];
} void mdf(int x,int L,int R,int l,int r,int k){
if (L==l && r==R){ put(x,L,R,k); return; }
int mid=(L+R)>>; push(x,L,R);
if (r<=mid) mdf(lson,l,r,k);
else if (l>mid) mdf(rson,l,r,k);
else mdf(lson,l,mid,k),mdf(rson,mid+,r,k);
v[x]=v[ls]+v[rs];
} P que(int x,int L,int R,int l,int r){
if (L==l && r==R) return v[x];
int mid=(L+R)>>; push(x,L,R);
if (r<=mid) return que(lson,l,r);
else if (l>mid) return que(rson,l,r);
else return que(lson,l,mid)+que(rson,mid+,r);
} int Q1(int d,int r){
P t=que(,,n,,d);
return (1ll*t.a[]*(2ll*r+)%mod-t.a[]+mod)%mod*inv2%mod;
} int Q2(int d,int r){
if (d>n) return ;
P t=que(,,n,d,n);
return (((2ll*n*r-1ll*n*n-n+2ll*r)%mod*t.a[]%mod+(2ll*n-2ll*r+)%mod*t.a[]%mod-t.a[])%mod+mod)%mod*inv2%mod;
} int Q3(int L,int R,int r){
P t=que(,,n,L,R); return 1ll*r*(r+)/%mod*t.a[]%mod;
} int Q4(int L,int R,int r){
if (L>R) return ;
P t=que(,,n,L,R);
return (((2ll*n*r-1ll*n*n-1ll*r*r+r-n)%mod*t.a[]%mod+(2ll*n+)*t.a[]%mod-2ll*t.a[])%mod+mod)%mod*inv2%mod;
} int solve(int r){
if (!r) return ;
int L=min(r,n-r+),R=max(r,n-r+);
if (L==R) R++;
int r1=Q1(L,r),r2=Q2(R,r);
int r3=(L+<=R-)?((r<=n-r+)?Q3(L+,R-,r):Q4(L+,R-,r)):;
return (1ll*r1+r2+r3)%mod;
} int main(){
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
n=rd(); m=rd();
rep(i,,n) a[i]=rd();
build(,,n);
while (m--){
op=rd(); l=rd(); r=rd();
if (l>r) swap(l,r);
if (op==) x=rd(),mdf(,,n,l,r,x);
else printf("%d\n",(solve(r)-solve(l-)+mod)%mod);
}
return ;
}

[BZOJ5291][BJOI2018]链上二次求和(线段树)的更多相关文章

  1. BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ ...

  2. BZOJ5291 BJOI2018链上二次求和(线段树)

    用线段树对每种长度的区间维护权值和. 考虑区间[l,r]+1对长度为k的区间的贡献,显然其为Σk-max(0,k-i)-max(0,k-(n-i+1)) (i=l~r). 大力展开讨论.首先变成Σk- ...

  3. 2018.01.04 bzoj5291: [Bjoi2018]链上二次求和(线段树)

    传送门 线段树基础题. 题意:给出一个序列,要求支持区间加,查询序列中所有满足区间长度在[L,R][L,R][L,R]之间的区间的权值之和(区间的权值即区间内所有数的和). 想题555分钟,写题202 ...

  4. 【BZOJ5291】[BJOI2018]链上二次求和(线段树)

    [BZOJ5291][BJOI2018]链上二次求和(线段树) 题面 BZOJ 洛谷 题解 考虑一次询问\([l,r]\)的答案.其中\(S\)表示前缀和 \(\displaystyle \sum_{ ...

  5. bzoj 5291: [Bjoi2018]链上二次求和

    Description 有一条长度为n的链(1≤i<n,点i与点i+1之间有一条边的无向图),每个点有一个整数权值,第i个点的权值是 a_i.现在有m个操作,每个操作如下: 操作1(修改):给定 ...

  6. 洛谷P4458 /loj#2512.[BJOI2018]链上二次求和(线段树)

    题面 传送门(loj) 传送门(洛谷) 题解 我果然是人傻常数大的典型啊-- 题解在这儿 //minamoto #include<bits/stdc++.h> #define R regi ...

  7. loj2512 [BJOI2018]链上二次求和

    传送门 分析 咕咕咕 代码 #include<iostream> #include<cstdio> #include<cstring> #include<st ...

  8. 「BJOI2018」链上二次求和

    「BJOI2018」链上二次求和 https://loj.ac/problem/2512 我说今天上午写博客吧.怕自己写一上午,就决定先写道题. 然后我就调了一上午线段树. 花了2h找到lazy标记没 ...

  9. [bzoj5291]链上二次求和

    记$bi=b_{i-1}+ai$,$ci=c_{i-1}+bi$,那么答案就是$\sum_{i=l}^{r}\sum_{j=0}^{n-i}b_{j+i}-bj=(r-l+1)cn-\sum_{i=l ...

随机推荐

  1. 状压dp+floyed(C - Hie with the Pie POJ - 3311 )

    题目链接:https://cn.vjudge.net/contest/276236#problem/C 题目大意: 给你一个有n+1(1<=n<=10)个点的有向完全图,用矩阵的形式给出任 ...

  2. macOS 安装 pcl 1.8.0

    Mac 上的 pcl 一直有问题. 找不到 pcl_viewer 查看 pcd 文件.写个程序用 pcl::visualization::CloudViewer 查看点云,遇到 Runtime Exc ...

  3. 数据库名(DB_NAME)、实例名(Instance_name)、以及操作系统环境变量(ORACLE_SID)

    数据库名(DB_NAME).实例名(Instance_name).以及操作系统环境变量(ORACLE_SID) 在ORACLE7.8数据库中只有数据库名(db_name)和数据库实例名(instanc ...

  4. 【codeforces】【比赛题解】#869 CF Round #439 (Div.2)

    良心赛,虽然我迟了半小时233333. 比赛链接:#869. 呃,CF的比赛都是有背景的……上次是<哈利波特>,这次是<物语>…… [A]巧妙的替换 题意: Karen发现了石 ...

  5. Oracle Certified Java Programmer 经典题目分析(二)

    ...接上篇 what is reserved(保留) words in java? A. run B. default C. implement D. import Java 关键字列表 (依字母排 ...

  6. HTTP之二 http 301 和 302的区别

    1.什么是301转向?什么是301重定向? 301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种, ...

  7. 栈应用之 后缀表达式计算 (python 版)

    栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1.  中缀表达式.前缀表达式.后缀表达式区别  中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...

  8. Java事务管理之Spring+Hibernate

    环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopallianceorg.aspe ...

  9. Effective STL 学习笔记:19 ~ 20

    Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  10. Elasticsearch5.0 安装问题

    使用Elasticsearch5.0 必须安装jdk1.8 [elsearch@vm-mysteel-dc-search01 bin]$ java -version java version &quo ...