「BJOI2018」链上二次求和
「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」链上二次求和的更多相关文章
- 【LOJ】#2512. 「BJOI2018」链上二次求和
题面 题解 转化一下可以变成所有小于等于r的减去小于等于l - 1的 然后我们求小于等于x的 显然是 \(\sum_{i = 1}^{n} \sum_{j = 1}^{min(i,x)} sum[i] ...
- 【BZOJ5291】[BJOI2018]链上二次求和(线段树)
[BZOJ5291][BJOI2018]链上二次求和(线段树) 题面 BZOJ 洛谷 题解 考虑一次询问\([l,r]\)的答案.其中\(S\)表示前缀和 \(\displaystyle \sum_{ ...
- BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树
原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ ...
- bzoj 5291: [Bjoi2018]链上二次求和
Description 有一条长度为n的链(1≤i<n,点i与点i+1之间有一条边的无向图),每个点有一个整数权值,第i个点的权值是 a_i.现在有m个操作,每个操作如下: 操作1(修改):给定 ...
- BZOJ5291 BJOI2018链上二次求和(线段树)
用线段树对每种长度的区间维护权值和. 考虑区间[l,r]+1对长度为k的区间的贡献,显然其为Σk-max(0,k-i)-max(0,k-(n-i+1)) (i=l~r). 大力展开讨论.首先变成Σk- ...
- [BZOJ5291][BJOI2018]链上二次求和(线段树)
感觉自己做的麻烦了,但常数似乎不算差.(只是Luogu最慢的点不到2s本地要跑10+s) 感觉我的想法是最自然的,但不明白为什么网上似乎找不到这种做法.(不过当然所有的做法都是分类大讨论,而我的方法手 ...
- 2018.01.04 bzoj5291: [Bjoi2018]链上二次求和(线段树)
传送门 线段树基础题. 题意:给出一个序列,要求支持区间加,查询序列中所有满足区间长度在[L,R][L,R][L,R]之间的区间的权值之和(区间的权值即区间内所有数的和). 想题555分钟,写题202 ...
- loj2512 [BJOI2018]链上二次求和
传送门 分析 咕咕咕 代码 #include<iostream> #include<cstdio> #include<cstring> #include<st ...
- 洛谷P4458 /loj#2512.[BJOI2018]链上二次求和(线段树)
题面 传送门(loj) 传送门(洛谷) 题解 我果然是人傻常数大的典型啊-- 题解在这儿 //minamoto #include<bits/stdc++.h> #define R regi ...
随机推荐
- java对象生命周期概述复习
最近看了下java对象的生命周期做个笔记复习复习,很多不同的原因会使一个java类被初始化,可能造成类初始化的操作: 1) 创建一个java类的实例对象. 2) 调用一个java类中的静态方法. ...
- js对象属性方法大总结(收集)
数组(Array):系列元素的有序集合: 详细演示请看:[js入门系列演示·数组 ] http://www.cnblogs.com/thcjp/archive/2006/08/04/467761.ht ...
- Eclipse Class Decompiler——Java反编译插件
http://www.blogjava.net/cnfree/archive/2012/10/30/390457.html Eclipse Class Decompiler是一款Eclipse插件,整 ...
- Python编程-函数进阶
一.函数对象 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 4 可以当作容器类型的元素 def foo(): print('from foo') ...
- Cocos2d-x项目移植到WP8系列之四:文件操作
原文链接: http://www.cnblogs.com/zouzf/p/3972457.html 读写文件Cocos已经用fopen fwrite来做好了,这里说的主要是文件和文件夹的创建.删除.判 ...
- PHP 面向对象及Mediawiki 框架分析(二)
mediaHandler可以理解为处理media文件的 /includes/filerepo/file/File.php /** * Get a MediaHandler instance for t ...
- iOS下的WiFi开发
iOS下Wi-Fi开发需要添加依赖库SystemConfiguration.framework,在需要使用Wi-Fi信息的控制器下引入头文件#import <SystemConfiguratio ...
- NLP学习常用的网页链接
[2016.7.5] 这是以前学习的时候整理的,放到博客里面,以后再有的话会更新~ 1.一个国外的学者维护的博客,介绍NLP [链接](http://nlpers.blogspot.jp/) 2.北京 ...
- spark总结5 RDD
创建RDD 有两种方式 1 通过hdfs支持的文件系统创建 RDD, RDD里面没有真正要计算的数据,只记录了一下元数据 2 从过scala集合或者数组以并行化的方式创建RDD collect 把结果 ...
- R语言学习笔记(4)
第四章:基本数据管理 一 贯穿整章的示例 二 变量的创建.重编码和重命名 三 日期值与缺失值 四 数据类型和类型转换 五 数据集的排序.合并与取子集 一 贯穿整章的示例(leadership) ,, ...