bzoj 1558: [JSOI2009]等差数列
Description
Solution
把原数组变为差分数组,然后剩下的就十分显然了
区间查询用线段树维护
修改操作就是区间加法和两个单点修改
一个等差数列实际上就是 开头一个数字+数值相等的一段
唯一的难点在于讨论这个开头的数字的去向
在线段树合并的时候
\(mid\) 左右两个元素如果相等的话是可以合并的,所以还需要做讨论
所以我们可以先不把左右两端点列入考虑对象,然后在合并时再讨论去向,综上需要维护的东西有:
1.区间的左右两个端点都不列入考虑的等差数列数量
2.区间的左端点列入考虑
3.区间的右段点列入考虑
4.区间的左右端点都列入考虑
\(4\) 就是我们要求的,每一种情况的转移都是类似的,转移我们可以分三种情况讨论:
1.左边的右端点和右边的左端点本身作为了等差数列的开头,左边的和右边的等差数列直接合并,如果相邻元素相等,则合为一个等差数列
2.左边的右端点自成一个等差数列
3.右边的左端点自成一个等差数列
#include<bits/stdc++.h>
#define ls (o<<1)
#define rs (o<<1|1)
using namespace std;
const int N=1e5+10;
int n,Q,a[N],w[N],la[N*4];
struct sub{
int a[4],wl,wr;
}t[N*4];
inline sub upd(sub a,sub b){
sub c;
c.a[0]=min(a.a[2]+b.a[1]-(a.wr==b.wl),min(a.a[0]+b.a[1],a.a[2]+b.a[0]));
c.a[1]=min(a.a[3]+b.a[1]-(a.wr==b.wl),min(a.a[1]+b.a[1],a.a[3]+b.a[0]));
c.a[2]=min(a.a[2]+b.a[3]-(a.wr==b.wl),min(a.a[2]+b.a[2],a.a[0]+b.a[3]));
c.a[3]=min(a.a[3]+b.a[3]-(a.wr==b.wl),min(a.a[3]+b.a[2],a.a[1]+b.a[3]));
c.wl=a.wl;c.wr=b.wr;
return c;
}
inline void build(int l,int r,int o){
if(l==r){
t[o].wl=t[o].wr=w[l];
t[o].a[1]=t[o].a[2]=t[o].a[3]=1;t[o].a[0]=0;
return ;
}
int mid=(l+r)>>1;
build(l,mid,ls);build(mid+1,r,rs);
t[o]=upd(t[ls],t[rs]);
}
inline void pushdown(int o){
if(!la[o])return ;
int k=la[o];la[o]=0;
t[ls].wl+=k;t[ls].wr+=k;la[ls]+=k;
t[rs].wl+=k;t[rs].wr+=k;la[rs]+=k;
}
inline sub qry(int l,int r,int o,int sa,int se){
if(sa<=l && r<=se)return t[o];
int mid=(l+r)>>1;sub ret;
pushdown(o);
if(se<=mid)ret=qry(l,mid,ls,sa,se);
else if(sa>mid)ret=qry(mid+1,r,rs,sa,se);
else ret=upd(qry(l,mid,ls,sa,mid),qry(mid+1,r,rs,mid+1,se));
t[o]=upd(t[ls],t[rs]);
return ret;
}
inline void Modify(int l,int r,int o,int sa,int se,int z){
if(sa<=l && r<=se){
la[o]+=z;t[o].wl+=z;t[o].wr+=z;
return ;
}
pushdown(o);
int mid=(l+r)>>1;
if(se<=mid)Modify(l,mid,ls,sa,se,z);
else if(sa>mid)Modify(mid+1,r,rs,sa,se,z);
else Modify(l,mid,ls,sa,mid,z),Modify(mid+1,r,rs,mid+1,se,z);
t[o]=upd(t[ls],t[rs]);
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<n;i++)w[i]=a[i+1]-a[i];
build(1,n-1,1);
int x,y,p,q;char op[3];
scanf("%d",&Q);
while(Q--){
scanf("%s%d%d",op,&x,&y);
if(op[0]=='B'){
if(x==y)puts("1");
else printf("%d\n",qry(1,n-1,1,x,y-1).a[3]);
}
else{
scanf("%d%d",&p,&q);
if(x>1)Modify(1,n-1,1,x-1,x-1,p);
if(y<n)Modify(1,n-1,1,y,y,-p-(y-x)*q);
if(x<y)Modify(1,n-1,1,x,y-1,q);
}
}
return 0;
}
bzoj 1558: [JSOI2009]等差数列的更多相关文章
- BZOJ.1558.[JSOI2009]等差数列(线段树 差分)
BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...
- BZOJ 1444:[JSOI2009]有趣的游戏
BZOJ 1444:[JSOI2009]有趣的游戏 题目链接 首先我们建出Trie图,然后高斯消元. 我们设\(f_i\)表示经过第\(i\)个点的期望次数: \[ f_x=\sum i\cdot p ...
- [BZOJ 2257][JSOI2009]瓶子和燃料 题解(GCD)
[BZOJ 2257][JSOI2009]瓶子和燃料 Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子 ...
- 洛谷 P4571 BZOJ 2257 [JSOI2009]瓶子和燃料
bzoj题目链接 上面hint那里是选择第2个瓶子和第3个瓶子 Time limit 10000 ms Memory limit 131072 kB OS Linux Source Jsoi2009 ...
- [JSOI2009]等差数列
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1558 题解: 考虑这么用线段树进行维护,由于他有区间修改等差数列 很容易想到可以用差分数组来维 ...
- BZOJ 3357: [Usaco2004]等差数列
3357: [Usaco2004]等差数列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 338 Solved: 160[Submit][Statu ...
- BZOJ 1452: [JSOI2009]Count 二维树状数组
1452: [JSOI2009]Count Description Input Output Sample Input Sample Output 1 2 HINT Source 题解:设定C[101 ...
- BZOJ 2257: [Jsoi2009]瓶子和燃料 裴蜀定理
2257: [Jsoi2009]瓶子和燃料 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- [BZOJ 1559] [JSOI2009] 密码 【AC自动机DP】
题目链接:BZOJ - 1559 题目分析 将给定的串建成AC自动机,然后在AC自动机上状压DP. 转移边就是Father -> Son 或 Now -> Fail. f[i][j][k] ...
随机推荐
- Flask 学习 七 用户认证
使用werkzeug 实现密码散列 from werkzeug.security import generate_password_hash,check_password_hash class Use ...
- css变化代码
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> ...
- fabric.js和高级画板
本文介绍fabric.js框架使用,以及使用fabricjs打造一个高级画板程序. 高级画板功能介绍 全局绘制颜色选择 护眼模式.网格模式切换 自由绘制 画箭头 画直线 画虚线 画圆/椭圆/矩形/直角 ...
- 更优雅的方式: JavaScript 中顺序执行异步函数
火于异步 1995年,当时最流行的浏览器--网景中开始运行 JavaScript (最初称为 LiveScript). 1996年,微软发布了 JScript 兼容 JavaScript.随着网景.微 ...
- VMware虚拟机,从厚置备改成精简置备,并减小硬盘的实际占用空间
工作中由于前期规划不足,导致磁盘空间分配较大,而且是厚置备.后期不再需要时,无法把用不到的空间释放出来,造成空间浪费.经过摸索和实验验证,总结出来一套方法. 风险提示:这个方法在我的环境中验证通过了, ...
- SpringBoot14 SpringBoot整合mybatis
1 版本说明 springboot:2.0 jdk:1.8 2 创建springBoot项目 创建项目时勾选必要web,MySQL,mybatis相关依赖 创建完成后再pom文件中添加自动部署.lom ...
- Python内置函数(36)——reversed
英文文档: reversed(seq) Return a reverse iterator. seq must be an object which has a __reversed__() meth ...
- apollo1.7.1初探(二)使用apollo订阅主题,发布主题消息
一.MQTT协议配置 为了使用MQTT协议,首先使用MQTT3.1协议的客户端连接到Apollo正在监听端口.Apollo会做协议检测,而且自动识别MQTT连接,而且将连接作为MQTT协议处理. 你不 ...
- 新概念英语(1-35)Our village
新概念英语(1-35)Our village Are the children coming out of the park or going into it ? This is a photogra ...
- 200行Py代码带你实现"打飞机"
前言 多年前,你我在一起"打飞机".为了实现真正的打飞机,在下一年前踏足帝都学习了无所不能的Python,辣么接下来带你在俩个小时用200行代码学会打飞机. python中提供了一 ...