「BJOI2018」链上二次求和

https://loj.ac/problem/2512

我说今天上午写博客吧。怕自己写一上午,就决定先写道题。

然后我就调了一上午线段树。

花了2h找到lazy标记没有清空。我tm清空了有没有标记没清空标记本身。

又花25min找到某个乘法爆int了。int真的淡疼,要不是longlong自带巨无霸常数,这辈子都不想用int。

一个上午就没有了。

 //Achen
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
#define Formylove return 0
const int N=,p=1e9+,inv2=5e8+;
typedef long long LL;
typedef double db;
using namespace std;
int n,m,a[N],sum[N]; template<typename T> void read(T &x) {
char ch=getchar(); T f=; x=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} int mo(int x) { return x<?x+p:(x>=p?x-p:x); } int sg[N<<],si0[N<<],si1[N<<],si2[N<<];
bool tg[N<<];
struct tag {
int a,b,c;
}lz[N<<],pls;
tag operator +(const tag&A,const tag&B) { return (tag){mo(A.a+B.a),mo(A.b+B.b),mo(A.c+B.c)}; } #define lc (x<<1)
#define rc ((x<<1)|1)
#define mid ((l+r)>>1)
void addtag(int x,tag y) {
//printf("%d %d %d %d\n",x,y.a,y.b,y.c);
sg[x]=mo(mo(mo(sg[x]+(LL)y.a*si2[x]%p)+(LL)y.b*si1[x]%p)+(LL)y.c*si0[x]%p);
lz[x]=lz[x]+y; tg[x]=;
//printf("%d %d %d\n",lz[x].a,lz[x].b,lz[x].c);
} void down(int x) {
if(!tg[x]) return ;
addtag(lc,lz[x]);
addtag(rc,lz[x]);
tg[x]=; lz[x]=(tag){,,};/////////
} void build(int x,int l,int r) {
if(l==r) {
sg[x]=sum[l]; si0[x]=; si1[x]=l;
si2[x]=(LL)l*l%p; return;
}
build(lc,l,mid); build(rc,mid+,r);
sg[x]=mo(sg[lc]+sg[rc]);
si0[x]=mo(si0[lc]+si0[rc]);
si1[x]=mo(si1[lc]+si1[rc]);
si2[x]=mo(si2[lc]+si2[rc]);
} void upd(int x,int l,int r,int ql,int qr) {
if(l>=ql&&r<=qr) { addtag(x,pls); return; }
down(x);
if(ql<=mid) upd(lc,l,mid,ql,qr);
if(qr>mid) upd(rc,mid+,r,ql,qr);
sg[x]=mo(sg[lc]+sg[rc]);
} int qry(int x,int l,int r,int ql,int qr) {
if(ql>qr) return ;
if(l>=ql&&r<=qr) return sg[x];
down(x);
if(qr<=mid) return qry(lc,l,mid,ql,qr);
if(ql>mid) return qry(rc,mid+,r,ql,qr);
return mo(qry(lc,l,mid,ql,qr)+qry(rc,mid+,r,ql,qr));
} int main() {
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
read(n); read(m);
For(i,,n) { read(a[i]); sum[i]=mo(sum[i-]+a[i]); }
For(i,,n) sum[i]=mo(sum[i-]+sum[i]);
build(,,n);
For(i,,m) {
int o,l,r,v;
read(o); read(l); read(r);
if(o==) {
read(v); if(l>r) swap(l,r);
int len=r-l+,a=(LL)v*inv2%p;
pls=(tag){a,(LL)a*(-*l+p)%p,((LL)l*l-*l+)%p*a%p}; upd(,,n,l,r);
if(r<n) {
pls=(tag){,(LL)len*v%p,((LL)len*(len+)/%p*v%p-(LL)len*r%p*v%p+p)%p};
upd(,,n,r+,n);
}
}
else if(o==) {
LL ans=(((LL)r-l+)*qry(,,n,n,n)%p-qry(,,n,max(,l-),r-)+p-qry(,,n,max(,n-r),n-l)+p)%p;
printf("%lld\n",ans);
}
}
Formylove;
}

「BJOI2018」链上二次求和的更多相关文章

  1. 【LOJ】#2512. 「BJOI2018」链上二次求和

    题面 题解 转化一下可以变成所有小于等于r的减去小于等于l - 1的 然后我们求小于等于x的 显然是 \(\sum_{i = 1}^{n} \sum_{j = 1}^{min(i,x)} sum[i] ...

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

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

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

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

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

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

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

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

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

    感觉自己做的麻烦了,但常数似乎不算差.(只是Luogu最慢的点不到2s本地要跑10+s) 感觉我的想法是最自然的,但不明白为什么网上似乎找不到这种做法.(不过当然所有的做法都是分类大讨论,而我的方法手 ...

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

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

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

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

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

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

随机推荐

  1. 树莓派使用DHT11温湿度传感器(C语言程序)

    pi4j是基于wiringpi开发的通过java来控制树莓派GPIO口的库文件.在java程序中引入相关类就可以使用已经封装好的方法控制树莓派GPIO口. pi4j官网:http://pi4j.com ...

  2. JavaScript笔记01——数据存储(包括.js文件的引用)

    While, generally speaking, HTML is for content and CSS is for presentation, JavaScript is for intera ...

  3. Java 中的会话管理—— HttpServlet,Cookies,URL Rewriting(转)

    索引 1.什么是 Session? 2.Java 中的会话管理—— Cookie 3.Java Servlet 中的 Session —— HttpSession 理解 JSESSIONID Cook ...

  4. linux 基础二---用户群租权限

    用户&群组&权限 一.用户 1.用户及passwd文件 1) 掌握/etc/passwd文件的功能:存储所有用户的相关信息,该文件也被称为用户信息数据库(Database). 2) / ...

  5. P4340 [SHOI2016]随机序列

    题目 P4340 [SHOI2016]随机序列 思维好题 做法 是否觉得水在于你是否发现加减是会抵消的,所以我们只用考虑乘的部分 一块乘只能前面无号(也就是前缀形式)才统计,所以用线段树维护区间前缀乘 ...

  6. 使用JDK将tomcat变成https访问

    1,今日JDK目录,执行命令 keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore " ...

  7. SOA 面向服务架构 阅读笔记(二)

    SOA并不能保证企业的员工更加轻松,企业的收益更加客观. 6.软件组件 6.1  组件和组件的作用  通过可重用的软件代码-组件,可以构建灵活的软件. 6.2  软件组件又称为应用程序,程序,函数,模 ...

  8. java 跨数据库导入大数据

    java 跨数据库导入大数据 /** * java程序跨服务器跨数据库批量导入导出百万级数据 * @param args * @throws Exception */ public static vo ...

  9. 3.6《深入理解计算机系统》笔记(四)虚拟存储器,malloc,垃圾回收【插图】

    概述 ●我们电脑上运行的程序都是使用虚拟存储,跟物理内存根本不搭边. ●既然虚拟内存是在磁盘上的,为什么它又运行这么好,并没有感觉卡顿?这要感谢程序的局部性! ●虚拟存储器的调度是一个操作系统必须做好 ...

  10. dll和lib

    lib:里面包含了很多源代码,工程会将这些源代码加入自己的项目中编译: dll:动态编译库,允许可执行文件在运行中加载里面的资源. 使用lib需注意两个文件:(1).h头文件,包含lib中说明输出的类 ...