Lucky Array CodeForces - 121E (线段树,好题)
题目大意:
定义只含数字$4,7$的数字为幸运数, 给定序列, 区间加正数, 区间询问多少个幸运数
题解:
对于每一个数, 求出它和第一个比它大的幸运数之差, 则问题转化为区间加,查询$0$的个数
可以维护最大值即最大值的个数, 对于最大值$<=0$直接打标记修改即可
对于最大值$>0$的暴力转移到下一个幸运数,
因为对于每个幸运数来说, 最多有n个元素暴力修改, 可以看成n个点单点更新
所以暴力修改的复杂度$O(Cnlogn)$, $C$为总幸运数个数
总复杂度$O((n+m)logn+Cnlogn)$
#include <iostream>
#include <algorithm>
#include <cstdio>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define mid ((l+r)>>1)
#define lc (o<<1)
#define rc (lc|1)
#define ls lc,l,mid
#define rs rc,mid+1,r
using namespace std; const int N = 4e5+, INF = 0x3f3f3f3f;
int n, m, ql, qr;
int a[N], s[N]; struct _ {
int mx, cnt, tag;
_ () {}
_ (int mx, int cnt) :mx(mx),cnt(cnt),tag() {}
_ operator + (const _ &rhs) const {
if (mx<rhs.mx) return _(rhs.mx,rhs.cnt);
if (mx>rhs.mx) return _(mx,cnt);
return _(mx,cnt+rhs.cnt);
}
void add(int k) {
mx+=k, tag+=k;
}
} v[N<<]; void dfs(int x) {
if (x>) return;
s[++*s]=x;
dfs(x*+),dfs(x*+);
} void build(int o, int l, int r) {
if (l==r) {
int t;
scanf("%d", &t);
int id = lower_bound(s+,s++*s,t)-s;
v[o]=_(t-s[id],);
a[l]=id;
return;
}
build(ls),build(rs);
v[o]=v[lc]+v[rc];
} void pd(int o) {
if (v[o].tag) {
v[lc].add(v[o].tag);
v[rc].add(v[o].tag);
v[o].tag=;
}
} void upd(int o, int l, int r) {
if (v[o].mx<=) return;
if (l==r) {
while (v[o].mx>) {
v[o].mx -= s[a[l]+]-s[a[l]];
++a[l];
}
return;
}
pd(o),upd(ls),upd(rs);
v[o]=v[lc]+v[rc];
} void add(int o, int l, int r, int k) {
if (ql<=l&&r<=qr) return v[o].add(k),upd(o,l,r);
pd(o);
if (mid>=ql) add(ls,k);
if (mid<qr) add(rs,k);
v[o]=v[lc]+v[rc];
} _ qry(int o, int l, int r) {
if (ql<=l&&r<=qr) return v[o];
pd(o);
if (mid<ql) return qry(rs);
if (mid>=qr) return qry(ls);
return qry(ls)+qry(rs);
} int main() {
dfs(),dfs();
sort(s+,s++*s),*s=unique(s+,s++*s)-s-;
s[++*s]=INF;
scanf("%d%d", &n, &m);
build(,,n);
REP(i,,m) {
int k;
char op[];
scanf("%s%d%d", op, &ql, &qr);
if (*op=='a') scanf("%d", &k), add(,,n,k);
else {
_ ret = qry(,,n);
printf("%d\n",ret.mx?:ret.cnt);
}
}
}
Lucky Array CodeForces - 121E (线段树,好题)的更多相关文章
- Lucky Array Codeforces - 121E && Bear and Bad Powers of 42 Codeforces - 679E
http://codeforces.com/contest/121/problem/E 话说这题貌似暴力可A啊... 正解是想出来了,结果重构代码,调了不知道多久才A 错误记录: 1.线段树搞混num ...
- Please, another Queries on Array? CodeForces - 1114F (线段树,欧拉函数)
这题刚开始看成求区间$\phi$和了........先说一下区间和的做法吧...... 就是说将题目的操作2改为求$(\sum\limits_{i=l}^{r}\phi(a[i]))\%P$ 首先要知 ...
- Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition) E - Nikita and stack 线段树好题
http://codeforces.com/contest/760/problem/E 题目大意:现在对栈有m个操作,但是顺序是乱的,现在每输入一个操作要求你输出当前的栈顶, 注意,已有操作要按它们的 ...
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...
- hdu-1540线段树刷题
title: hdu-1540线段树刷题 date: 2018-10-18 19:55:21 tags: acm 刷题 categories: ACM-线段树 概述 哇,,,这道线段树的题可以说是到目 ...
- hdu-5023线段树刷题
title: hdu-5023线段树刷题 date: 2018-10-18 13:32:13 tags: acm 刷题 categories: ACM-线段树 概述 这道题和上次做的那道染色问题一样, ...
- poj-2777线段树刷题
title: poj-2777线段树刷题 date: 2018-10-16 20:01:07 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道线段树的染色问题,,, ...
- zoj-1610线段树刷题
title: zoj-1610线段树刷题 date: 2018-10-16 16:49:47 tags: acm 刷题 categories: ACM-线段树 概述 这道题是一道简单的线段树区间染色问 ...
随机推荐
- C/C++之宏、内联函数和普通函数的区别
内联函数的执行过程与带参数宏定义很相似,但参数的处理不同.带参数的宏定义并不对参数进行运算,而是直接替换:内联函数首先是函数,这就意味着函数的很多性质都适用于内联函数,即内联函数先把参数表达式进行运算 ...
- MySQL数据库----IDE工具介绍及数据备份
一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 二.MySQL数据备份 # ...
- Java MD5校验与RSA加密
区别: MD5加密: 加密时通过原字符串加密成另一串字符串 解密时需要原加密字符串进行重新加密比较两次加密结果是否一致 RSA加密: 加密时通过原字符串生成密钥对(公钥+私钥) 解密时通过公钥和私钥进 ...
- 编译安装 http
1. 安装 apr http服务依赖 apr和apr-util ,安装 http 前需先安装这两个程序 apr 简介:http://www.cnblogs.com/Alight/p/3997777.h ...
- c++中的字符集与中文
就非西欧字符而言,比如中国以及港澳台,在任何编程语言的开发中都不得不考虑字符集及其表示.在c++中,对于超过1个字节的字符,有两种方式可以表示: 1.多字节表示法:通常用于存储(空间效率考虑). 2. ...
- 添加用户到 sudo
sudo 简介: 在 Linux 中系统管理员可以通过 sudo 实用程序让用户或组能够作为另一个用户运行命令.换句话说,可以分派命令特权,而不需要另一个用户的密码.root 用户通过在 /etc/s ...
- HDU 1548 A strange lift (Dijkstra)
https://vjudge.net/problem/HDU-1548 题意: 电梯每层有一个不同的数字,例如第n层有个数字k,那么这一层只能上k层或下k层,但是不能低于一层或高于n层,给定起点与终点 ...
- hdu 5671 Matrix 标记。。。有点晕
Matrix Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem ...
- ubuntu14.04, libtinyxml.so.2.6.2: cannot open shared object file: No such file or directory
打包/opt/ros 打包项目文件install 到一台没有安装ros环境的机器上启动项目 source ros/indigo/setup.bash source install/setup.bash ...
- js 二进制转换为16进制数
<!DOCTYPE html> <html> <head> <title>远程监控</title> </head> <bo ...