Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array
Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decimal representation contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467are not.
Petya has an array consisting of n numbers. He wants to perform m operations of two types:
- add l r d — add an integer d to all elements whose indexes belong to the interval from l to r, inclusive (1 ≤ l ≤ r ≤ n, 1 ≤ d ≤ 104);
- count l r — find and print on the screen how many lucky numbers there are among elements with indexes that belong to the interval from l to r inclusive (1 ≤ l ≤ r ≤ n). Each lucky number should be counted as many times as it appears in the interval.
Petya has a list of all operations. The operations are such that after all additions the array won't have numbers that would exceed 104. Help Petya write a program that would perform these operations.
The first line contains two integers n and m (1 ≤ n, m ≤ 105) — the number of numbers in the array and the number of operations correspondingly. The second line contains n positive integers, none of which exceeds 104— those are the array numbers. Next m lines contain operations, one per line. They correspond to the description given in the statement.
It is guaranteed that after all operations are fulfilled each number in the array will not exceed 104.
For each operation of the second type print the single number on the single line — the number of lucky numbers in the corresponding interval.
3 6
2 3 4
count 1 3
count 1 2
add 1 3 2
count 1 3
add 2 3 3
count 1 3
1
0
1
1
题意:给出一组序列然后找出区间lcuk数字的个数。
sl: 线段树树状数组第一时间确定是这个数据结构,剩下的就不会了。
扫了一眼题解发现都是树状数组暴力搞得。时间快的就是线段树加一个优化。
优化: 维护区间内的数字到达一个luck数字的最小距离。要是区间修改之后不能使得最小的距离变为0 那么就直接lazy修改下区间luck距离的最小值。
要是超过了,那么就递归到叶子节点直接修改。 时间复杂度我在研究研究。
1 // by caonima
2 // hehe
3 #include <bits/stdc++.h>
4 using namespace std;
5 const int MAX = 1e5+;
6 int num[MAX<<],Min[MAX<<] ,col[MAX<<],cnt[MAX<<];
7 int a[MAX],Luck_num[MAX],cur=;
8 int is_luck[MAX];
9 char op[];
10 void dfs(int u) {
11 if(u>) return ;
12 is_luck[u]=true;
13 Luck_num[cur++]=u;
14
15 dfs(u*+);
16 dfs(u*+);
17 return ;
18 }
19 int check(int x) {
20 for(int i=;i<cur;i++) {
21 if(x<Luck_num[i]) return Luck_num[i]-x;
22 }
23 return ;
24 }
25 void push_up(int o) {
26 cnt[o]=cnt[o<<]+cnt[o<<|];
27 Min[o]=min(Min[o<<],Min[o<<|]);
28 }
29 void build(int L,int R,int o) {
30 if(L==R) {
31 num[o]=a[L]; col[o]=;
32 if(is_luck[a[L]]) cnt[o]=;
33 else cnt[o]=;
34 Min[o]=check(a[L]);
35 return ;
36 }
37 int mid=(L+R)>>;
38 build(L,mid,o<<);
39 build(mid+,R,o<<|);
40 push_up(o);
41 }
42 void push_down(int o,int m) {
43 if(col[o]) {
44 col[o<<]+=col[o]; col[o<<|]+=col[o];
45 Min[o<<]-=col[o<<]; Min[o<<|]-=col[o<<|];
46 cnt[o<<]=cnt[o<<|]=;
47 col[o]=;
48 }
49 }
50
51 int Query(int L,int R,int o,int ls,int rs) {
52 if(ls<=L&&rs>=R) {
53 return cnt[o];
54 }
55 push_down(o,R-L+);//printf("s");
56 int mid=(R+L)>>;
57 int cnt=;
58 if(ls<=mid) cnt+=Query(L,mid,o<<,ls,rs);
59 if(rs>mid) cnt+=Query(mid+,R,o<<|,ls,rs);
60 push_up(o);
61 return cnt;
62 }
63
64 void Update(int L,int R,int o,int ls,int rs,int val) {
65 if(ls<=L&&rs>=R) {
66 if(L==R) {
67 num[o]+=col[o]+val;
68 col[o]=;
69 // printf("%d\n",num[o]);
70 if(is_luck[num[o]]) cnt[o]=;
71 else cnt[o]=;
72 Min[o]=check(num[o]);
73
74 return ;
75 }
76 if(col[o]+val<Min[o]) {
77 Min[o]-=(col[o]+val);
78 col[o]+=val;
79 cnt[o]=;
80 return ;
81 }
82 }
83
84 push_down(o,R-L+);
85 int mid=(R+L)>>;
86 if(ls<=mid) Update(L,mid,o<<,ls,rs,val);
87 if(rs>mid) Update(mid+,R,o<<|,ls,rs,val);
88 push_up(o);
89 return ;
90 }
91
92 int main() {
93 int n,m,ls,rs,v;
94 dfs(); dfs();
95 sort(Luck_num,Luck_num+cur);
96 while(scanf("%d %d",&n,&m)==) {
97 for(int i=;i<=n;i++) scanf("%d",&a[i]);
98 build(,n,);
99 for(int i=;i<=m;i++) {
scanf("%s",op);
if(op[]=='c') {
scanf("%d %d",&ls,&rs);
int ans=Query(,n,,ls,rs);
printf("%d\n",ans);
}
else {
scanf("%d %d %d",&ls,&rs,&v);
Update(,n,,ls,rs,v);
}
}
}
return ;
113 }
Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array的更多相关文章
- Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array 分块
E. Lucky Array time limit per test 4 seconds memory limit per test 256 megabytes input standard inpu ...
- codeforces水题100道 第十二题 Codeforces Beta Round #91 (Div. 2 Only) A. Lucky Division (brute force)
题目链接:http://www.codeforces.com/problemset/problem/122/A题意:判断一个数是否能被一个lucky number整除,一个lucky number是一 ...
- Codeforces Beta Round #91 (Div. 2 Only) A. Lucky Division【暴力/判断是不是幸运数字4,7的倍数】
A. Lucky Division time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- Codeforces Beta Round #80 (Div. 2 Only)【ABCD】
Codeforces Beta Round #80 (Div. 2 Only) A Blackjack1 题意 一共52张扑克,A代表1或者11,2-10表示自己的数字,其他都表示10 现在你已经有一 ...
- Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】
Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...
- Codeforces Beta Round #79 (Div. 2 Only)
Codeforces Beta Round #79 (Div. 2 Only) http://codeforces.com/contest/102 A #include<bits/stdc++. ...
- Codeforces Beta Round #77 (Div. 2 Only)
Codeforces Beta Round #77 (Div. 2 Only) http://codeforces.com/contest/96 A #include<bits/stdc++.h ...
- Codeforces Beta Round #76 (Div. 2 Only)
Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...
- Codeforces Beta Round #75 (Div. 2 Only)
Codeforces Beta Round #75 (Div. 2 Only) http://codeforces.com/contest/92 A #include<iostream> ...
随机推荐
- JMeter配置MongoDB
1.启动JMeter,右键添加->配置文件->MongoDB Source Config. 注意:JMeter 3.0以上版本去掉了此配置项,可以从低版本处拷贝. 2.设置MongoDB配 ...
- 全面学习ORACLE Scheduler特性(12)使用Windows和Window Groups
七.使用Windows 此Windows非彼Windows,通常说的Windows是指盖首富的操作系统,而此处所说的Windows,是指SCHEDULER特性中的一个子项.在SCHEDULER中,WI ...
- scala学习笔记1: scala method
刚接触scala,做练习的时候碰到一个问题,顺便mark一下. 先看下面一段代码: def sum(args:Int*) = { var result = 0 for (arg <- args) ...
- Quartz.Net学习笔记(1)-完整的例子
一.开发环境 系统:Win10 编译器:VS2013 .Net版本:4.5 Quartz版本:2.3.3 二.涉及程序集 Common.Logging.Core.dll Common.Logging. ...
- 实例化WebService实例对象时出现localhost未引用命名空间
//实例化WebService实例对象 localhost.WebService WebserviceInstance = new localhost.WebService(); 在实例化WebSer ...
- 网页添加qq咨询
<style>.box{ width:130px; height:150px; position:fixed; right:0px; top:30%; z-index:999; borde ...
- vue2.0之60s验证码发送
快速的说下我的60s经历不管移动还是pc端的登录都需要发送验证信息,那么我们熟悉的那个验证按钮就不可少了.首先,我们都知道的一些基本功能.1.验证账号输入的格式正确与否(减少传递基本的错误信息)2.@ ...
- SQL server 上机练习题
首先创建一个数据库,里面有 登录表 学生表 课程表 选课表 成绩表 1. 查询Student表中的所有记录的Sname.Ssex和Class列.2. 查询教师所有的单位即不重复的Depart列 ...
- (转)淘淘商城系列——导入商品数据到索引库——Service层
http://blog.csdn.net/yerenyuan_pku/article/details/72894187 通过上文的学习,我相信大家已经学会了如何使用Solrj来操作索引库.本文我们将把 ...
- Nginx 通过 certbot 为网站自动配置 SSL 证书并续期
一.背景知识 1.1.http 和 https 是什么? 简单来说,http 是一个传输网页内容的协议,比如你看到的 http 开头的网站 http://www.163.com ,其网页上的文字.图片 ...