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> ...
随机推荐
- GG_DataAccess 数据库访问层使用dapper操作
3.5.GG_DataAccess 数据库访问层使用dapper操作 和Model实体类同理,tt模板已写好,需要的可加qq群:547765059 自己下载.
- Uva 796 Critical Links (割边+排序)
题目链接: Uva 796 Critical Links 题目描述: 题目中给出一个有可能不连通的无向图,求出这个图的桥,并且把桥按照起点升序输出(还有啊,还有啊,每个桥的起点要比终点靠前啊),这个题 ...
- Spring.Net学习笔记(1)-容器的使用
一.下载地址: http://www.springframework.net/download.html 二.相关程序集 Spring.Net容器定义在程序集Spring.Core.dll中,它依赖于 ...
- 微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
在这里给大家分享下我的心得,1.写代码前一定要对整个流程有个了解.我就是因为在先不了解整个过程中去ctrl+c+v他人的博客代码,花费很多无用的时间去处理还不知道能不能跑的起来的代码. 2.本人比较喜 ...
- windows服务器监控多个tomcat运行状态
第一步,修改tomcat默认的进程名 因为所有的tomcat项目的进程名默认都叫java.exe,所以需要修改tomcat容器bin目录下的setclasspath.bat.注释掉:(在set前加上 ...
- (转)版本管理工具介绍——SVN篇(一)
http://blog.csdn.net/yerenyuan_pku/article/details/72620101 SVN是何物 SVN是Subversion的简称,是一款集中式的开源版本控制系统 ...
- (转) 淘淘商城系列——使用SolrJ查询索引库
http://blog.csdn.net/yerenyuan_pku/article/details/72908538 我们有必要在工程中写查询索引库的代码前先进行必要的测试.我们先到Solr服务页面 ...
- ThinkPHP---框架介绍
(1)什么是框架? ①框架是一堆包含了常量.方法和类等代码集合: ②半成品应用,只包含了项目开发时的底层架构,并不包含业务逻辑: ③包含一些设计模式,例如单例模式,工厂模式,AR(Active Rec ...
- SAS,SATA普及文档
目前所能见到的硬盘接口类型主要有IDE.SATA.SCSI.SAS.FC等等. IDE是俗称的并口,SATA是俗称的串口,这两种硬盘是个人电脑和低端服务器常见的硬盘.SCSI是"小型计算机系 ...
- 话说Form标签的target属性-----无刷新表单提交
国庆前(2013)无聊,就在铁道部的12306上“逛”了下下. PS:原来之所以叫12306,是因为其客服号码是12306,好吧,我很无知…… 首先是被“逛”的页面:票价查询. 之所以去逛,是因为一直 ...