[Luogu] 等差数列
https://www.luogu.org/problemnew/show/P4243#sub
自己的思路错了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std;
const int N = 1e5 + ; #define gc getchar() int F[N << ], tot[N << ], l_col[N << ], r_col[N << ];
int n, Ty, Answer;
int my[N], data[N]; inline int read() {
int x = , f = ; char c = gc;
while(c < '' || c > '') {if(c == '-') f = -; c = gc;}
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x * f;
} #define lson jd << 1
#define rson jd << 1 | 1 void Push_up(int jd) {
l_col[jd] = l_col[lson]; r_col[jd] = r_col[rson];
tot[jd] = tot[lson] + tot[rson];
if(r_col[lson] == l_col[rson]) tot[jd] --;
return ;
} void Build_tree(int l, int r, int jd) {
if(l == r) {l_col[jd] = r_col[jd] = data[l]; tot[jd] = ; return ;}
int mid = (l + r) >> ;
Build_tree(l, mid, lson);
Build_tree(mid + , r, rson);
Push_up(jd);
} void Push_down(int jd) {
F[lson] += F[jd]; F[rson] += F[jd];
l_col[lson] += F[jd]; r_col[lson] += F[jd];
l_col[rson] += F[jd]; r_col[rson] += F[jd];
F[jd] = ;
return ;
} void Poi_G(int l, int r, int jd, int x, int num) {
if(l == r) {l_col[jd] += num; r_col[jd] += num; return ;}
if(F[jd]) Push_down(jd);
int mid = (l + r) >> ;
if(x <= mid) Poi_G(l, mid, lson, x, num);
else Poi_G(mid + , r, rson, x, num);
Push_up(jd);
} void Sec_G(int l, int r, int jd, int x, int y, int num) {
if(x <= l && r <= y) {F[jd] += num; l_col[jd] += num; r_col[jd] += num; return ;}
if(F[jd]) Push_down(jd);
int mid = (l + r) >> ;
if(x <= mid) Sec_G(l, mid, lson, x, y, num);
if(y > mid) Sec_G(mid + , r, rson, x, y, num);
Push_up(jd);
} void Sec_A(int l, int r, int jd, int x, int y) {
if(x <= l && r <= y) {Answer += tot[jd]; return ;}
if(F[jd]) Push_down(jd);
int mid = (l + r) >> ;
if(x <= mid) Sec_A(l, mid, lson, x, y);
if(y > mid) Sec_A(mid + , r, rson, x, y);
if(x <= mid && y > mid && r_col[lson] == l_col[rson]) Answer --;
} int main() {
n = read();
for(int i = ; i <= n; i ++) my[i] = read();
for(int i = ; i <= n; i ++) data[i] = my[i] - my[i - ];
Build_tree(, n, );
Ty = read();
while(Ty --) {
string s; cin >> s;
if(s[] == 'A') {
int l = read(), r = read(), a = read(), b = read();
int imp = a + (r - l) * b;
if(l != ) Poi_G(, n, , l, a);
Sec_G(, n, , l + , r, b);
Poi_G(, n, , r + , - imp);
} else {
Answer = ;
int l = read(), r = read();
if(l == r) {cout << "" << endl; continue ;}
Sec_A(, n, , l, r);
cout << Answer << endl;
}
}
return ;
}
https://www.cnblogs.com/zbtrs/p/8424737.html
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll; const ll maxn = ;
ll n,a[maxn],b[maxn],q; struct node {
ll ls,rs,lsize,rsize,sum,tag,sizee;
void init() {
ls = rs = lsize = rsize = sum = tag = sizee = ;
}
} e[maxn]; void pushdown(ll o) {
if (e[o].tag) {
e[o * ].tag += e[o].tag;
e[o * + ].tag += e[o].tag;
e[o * ].ls += e[o].tag;
e[o * + ].ls += e[o].tag;
e[o * ].rs += e[o].tag;
e[o * + ].rs += e[o].tag;
e[o].tag = ;
}
} node pushup(node a,node b) {
bool flag = (a.rs == b.ls);
node c;
c.init();
c.ls = a.ls;
c.rs = b.rs;
c.sizee = a.sizee + b.sizee;
c.sum = a.sum + b.sum;
if (a.sum == && b.sum == ) {
if (!flag) {
c.lsize = a.sizee + b.sizee;
c.rsize = a.sizee + b.sizee;
} else {
c.lsize = a.lsize - ;
c.rsize = b.rsize - ;
++c.sum;
}
return c;
}
if (a.sum == ) {
c.rsize = b.rsize;
if (!flag)
c.lsize = a.sizee + b.lsize;
else {
c.lsize = a.lsize - ;
if (b.lsize > )
c.sum += (b.lsize - ) / + ;
}
return c;
}
if (b.sum == ) {
c.lsize = a.lsize;
if (!flag)
c.rsize = b.sizee + a.rsize;
else {
c.rsize = b.rsize - ;
if (a.rsize > )
c.sum += (a.rsize - ) / + ;
}
return c;
}
c.lsize = a.lsize;
c.rsize = b.rsize;
if (a.rsize == && b.lsize == ) {
if (flag)
c.sum--;
return c;
}
if (a.rsize == ) {
if (flag)
c.sum += (b.lsize - ) / ;
else
c.sum += b.lsize / ;
return c;
}
if (b.lsize == ) {
if (flag)
c.sum += (a.rsize - ) / ;
else
c.sum += a.rsize / ;
return c;
}
ll minn = (a.rsize + b.lsize) / ;
if (flag)
minn = min(minn, + (a.rsize - ) / + (b.lsize - ) / );
c.sum += minn;
return c;
} void build(ll o,ll l,ll r) {
if (l == r) {
e[o].init();
e[o].ls = e[o].rs = b[l];
e[o].lsize = e[o].rsize = ;
e[o].sizee = ;
return;
}
ll mid = (l + r) >> ;
build(o * ,l,mid);
build(o * + ,mid + ,r);
e[o] = pushup(e[o * ],e[o * + ]);
} void update1(ll o,ll l,ll r,ll pos,ll v) {
if (l == r) {
e[o].ls += v;
e[o].rs += v;
return;
}
pushdown(o);
ll mid = (l + r) >> ;
if (pos <= mid)
update1(o * ,l,mid,pos,v);
else
update1(o * + ,mid + ,r,pos,v);
e[o] = pushup(e[o * ],e[o * + ]);
} void update2(ll o,ll l,ll r,ll x,ll y,ll v) {
if (x <= l && r <= y) {
e[o].ls += v;
e[o].rs += v;
e[o].tag += v;
return;
}
pushdown(o);
ll mid = (l + r) >> ;
if (x <= mid)
update2(o * ,l,mid,x,y,v);
if (y > mid)
update2(o * + ,mid + ,r,x,y,v);
e[o] = pushup(e[o * ],e[o * + ]);
} node query(ll o,ll l,ll r,ll x,ll y) {
if (x <= l && r <= y)
return e[o];
pushdown(o);
ll mid = (l + r) >> ;
if (y <= mid)
return query(o * ,l,mid,x,y);
else if (x > mid)
return query(o * + ,mid + ,r,x,y);
else
return pushup(query(o * ,l,mid,x,mid),query(o * + ,mid + ,r,mid + ,y));
} int main() {
scanf("%lld",&n);
for (ll i = ; i <= n; i++)
scanf("%lld",&a[i]);
for (ll i = ; i < n; i++)
b[i] = a[i + ] - a[i];
n--;
build(,,n);
scanf("%lld",&q);
while (q--) {
char ch[];
ll s,t,a,b;
scanf("%s",ch);
if (ch[] == 'A') {
scanf("%lld%lld%lld%lld",&s,&t,&a,&b);
if (s != )
update1(,,n,s - ,a);
if (t != n + )
update1(,,n,t,- * ((t - s) * b + a));
if (s <= t - )
update2(,,n,s,t - ,b);
} else {
scanf("%lld%lld",&s,&t);
if (s == t) {
printf("1\n");
continue;
}
node temp = query(,,n,s,t - );
ll res = (t - s + ) / ;
if (temp.sum == )
printf("%lld\n",res);
else {
res = min(res,temp.sum + (temp.lsize + ) / + (temp.rsize + ) / );
printf("%lld\n",res);
}
}
} return ;
}
[Luogu] 等差数列的更多相关文章
- luogu P1214 [USACO1.4]等差数列 Arithmetic Progressions
题目描述 一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)的数列. 在这个问题中a是一个非负的整数,b是正整数.写一个程序来找出在双平方数集合(双 ...
- luogu P4243 [JSOI2009]等差数列 题解
前言: 这题真ex... 强烈谴责在题解里面放毒瘤题链接的屑出题人! 吐 ️ 解析: 这题分成两步走. 首先,既然题目中的修改操作是区间加等差数列,那么就容易想到在差分数组上进行操作. 然后就是相当恶 ...
- 【题解】Luogu P5313 僕たちはひとつの光([Ynoi2012]D2T2)
原题传送门 lovelive好评 比赛时只拿到了60pts,还是自己太菜了 这题的思想实际有点像Luogu P3674 小清新人渣的本愿与Luogu P5071 [Ynoi2015]此时此刻的光辉 这 ...
- luogu P4156 [WC2016]论战捆竹竿
传送门 官方题解(证明都在这) 神仙题鸭qwq 转化模型,发现这题本质就是一个集合,每次可以加上集合里的数,问可以拼出多少不同的数 首先暴力需要膜意义下的最短路,例题戳这 然后这个暴力可以优化成N^2 ...
- [luogu P1438] 无聊的数列
[luogu P1438] 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个 ...
- [luogu P4230]连环病原体
[luogu P4230] 连环病原体 题意 给定一个长度为 \(n\) 的边序列, 当这个序列的一个子区间内的边都加入图中时产生了环则称其为"加强区间", 求序列中的每条边在多少 ...
- 洛谷 P1214 等差数列
https://www.luogu.org/problemnew/show/P1214 首先暴力枚举可以凑出来的数,对于每个数进行标记. 对于每一个等差数列,当我们知道前两个数后即可以得出整个序列,那 ...
- 「Luogu 3792」由乃与大母神原型和偶像崇拜
更好的阅读体验 Portal Portal1: Luogu Description 给你一个序列\(a\) 每次两个操作: 修改\(x\)位置的值为\(y\): 查询区间\([l, r]\)是否可以重 ...
- [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)
题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...
随机推荐
- VS2017生成一个简单的DLL文件 和 LIB文件——C语言
下面我们将用两种不同的姿势来用VS2017生成dll文件(动态库文件)和lib文件(静态库文件),这里以C语言为例,用最简单的例子,来让读者了解如何生成dll文件(动态库文件) 生成动态库文件 姿势一 ...
- oracle多表关联删除的两种方法
oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...
- html跑马灯/走马灯效果
实现跑马灯的方法很多,其中最简单的是采用一句Html代码来实现,我们在需要出现跑马灯效果的地方插入“<marquee>滚动的文字</marquee>”语句,它的效果如下所示: ...
- 怎样获取所有style节点
通过 document.styleSheets 获取所有的样式表节点. document.styleSheets instanceof StyleSheetList; // true 注意: 1. 返 ...
- springMvc 框架
第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler 可以根据xml配置.注解进行查找 第三步:处理器映射器Han ...
- Java集合--Hash、Hash冲突
一.Hash 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构.也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这 ...
- 【php设计模式】模板模式
定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤. 通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同 ...
- 个人学习HTML以及CSS所得体会
拥有自己样式的浏览器: 苹果,欧朋,谷歌,IE,火狐 form标签<form></form> 表单属性: 1,action主要同来规定表单的作用,提交到处理器上面处理URL,默 ...
- Spring web.xml详解
web.xml文件是Java Web项目中的一个配置文件,主要用于配置欢迎页.Filter.Listener.Servlet等,但并不是必须的,一个Java Web项目没有web.xml文件也是照样能 ...
- MySQL存储引擎MyISAM和InnoDB,索引结构优缺点
MySQL存储引擎MyISAM和InnoDB底层索引结构 深入理解MySQL索引底层数据结构与算法 (各种索引结构优缺点) Myisam和Innodb索引实现的不同(存储结构) 存储引擎作用于什么对象 ...