time limit per test

4 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

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, 467 are 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.

Input

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.

Output

For each operation of the second type print the single number on the single line — the number of lucky numbers in the corresponding interval.

Examples
input
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
output
1
0
1
1
input
4 5
4 4 4 4
count 1 4
add 1 4 3
count 1 4
add 2 3 40
count 1 4
output
4
4
4
Note

In the first sample after the first addition the array will look in the following manner:

4 5 6

After the second addition:

4 8 9

The second sample after the first addition:

7 7 7 7

After the second addition:

7 47 47 7

线段树区间修改,单点查询

if(v) single_change(root,i,v);

这一句没写 T成傻逼了。

指针线段树比数组线段树慢近300ms

数组线段树比树状数组慢近1000ms

屠龙宝刀点击就送

线段树代码

#include <ctype.h>
#include <cstdio>
const int N = 1e6+;
bool IsLucky[N];
int dis[N],n,m,Lucky[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
inline void Read(int &x)
{
bool f=;
register char ch=getchar();
for(x=;!isdigit(ch);ch=getchar()) if(ch=='-') f=;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
x=f?-x:x;
}
struct Segment
{
int l,r,mid,flag,upval;
Segment * ch[];
Segment()
{
ch[]=ch[]=NULL;
flag=upval=;
}
};
inline void pushup(Segment *&k) {k->upval=k->ch[]->upval+k->ch[]->upval;}
void build(Segment *&k,int l,int r)
{
k=new Segment;
k->l=l;k->r=r;
if(l==r)
{
if(IsLucky[dis[l]]) k->upval+=;
return;
}
k->mid=l+r>>;
build(k->ch[],l,k->mid);
build(k->ch[],k->mid+,r);
pushup(k);
}
int query(Segment *&k,int l,int r)
{
if(k->l==l&&k->r==r)
return k->upval;
if(l>k->mid) return query(k->ch[],l,r);
else if(r<=k->mid) return query(k->ch[],l,r);
else return query(k->ch[],l,k->mid)+query(k->ch[],k->mid+,r);
}
void single_change(Segment *&k,int t,int v)
{
if(k->l==k->r)
{
k->upval+=v;
return;
}
if(t<=k->mid) single_change(k->ch[],t,v);
else single_change(k->ch[],t,v);
pushup(k);
}
int Main()
{
Read(n);
Read(m);
for(int i=;i<=;++i) IsLucky[Lucky[i]]=;
for(int i=;i<=n;++i) scanf("%d",&dis[i]);
Segment *root=new Segment;
build(root,,n);
char str[];
for(int x,y,z;m--;)
{
scanf("%s",str+);
if(str[]=='c')
{
Read(x);
Read(y);
printf("%d\n",query(root,x,y));
}
else
{
Read(x);
Read(y);
Read(z);
for(int i=x;i<=y;++i)
{
int v=;
if(IsLucky[dis[i]]) --v;
dis[i]+=z;
if(IsLucky[dis[i]]) ++v;
if(v) single_change(root,i,v);
}
}
}
return ;
}
int sb=Main();
int main(int argc,char *argv[]){;}

树状数组

#include <ctype.h>
#include <cstdio>
const int N = 1e6+;
bool IsLucky[N];
int tag[N],dis[N],n,m,Lucky[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
inline void Read(int &x)
{
bool f=;register char ch=getchar();
for(x=;!isdigit(ch);ch=getchar()) if(ch=='-') f=;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
x=f?-x:x;
}
inline int lowbit(int x) {return x&(-x);}
inline void modify(int x,int y)
{
for(;x<=n;x+=lowbit(x)) tag[x]+=y;
}
inline int ask(int x)
{
int sum=;
for(;x;x-=lowbit(x)) sum+=tag[x];
return sum;
}
int main()
{
Read(n);Read(m);
for(int i=;i<=;++i) IsLucky[Lucky[i]]=;
for(int i=;i<=n;++i) {Read(dis[i]);if(IsLucky[dis[i]]) modify(i,);}
char str[];
for(int x,y,z;m--;)
{
scanf("%s",str+);
if(str[]=='c')
{
Read(x);
Read(y);
printf("%d\n",ask(y)-ask(x-));
}
else
{
Read(x);
Read(y);
Read(z);
for(int i=x;i<=y;++i)
{
int v=;
if(IsLucky[dis[i]]) --v;
dis[i]+=z;
if(IsLucky[dis[i]]) ++v;
if(v) modify(i,v);
}
}
}
return ;
}

codeforces 121 E. Lucky Array的更多相关文章

  1. 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 ...

  2. Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array

    E. Lucky Array Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers w ...

  3. Codeforces 442C Artem and Array(stack+贪婪)

    题目连接:Codeforces 442C Artem and Array 题目大意:给出一个数组,每次删除一个数.删除一个数的得分为两边数的最小值,假设左右有一边不存在则算作0分. 问最大得分是多少. ...

  4. Codeforces Round #504 D. Array Restoration

    Codeforces Round #504 D. Array Restoration 题目描述:有一个长度为\(n\)的序列\(a\),有\(q\)次操作,第\(i\)次选择一个区间,将区间里的数全部 ...

  5. CodeForces 122G Lucky Array(一脸懵逼的树状数组)

    Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decimal re ...

  6. Lucky Array Codeforces - 121E && Bear and Bad Powers of 42 Codeforces - 679E

    http://codeforces.com/contest/121/problem/E 话说这题貌似暴力可A啊... 正解是想出来了,结果重构代码,调了不知道多久才A 错误记录: 1.线段树搞混num ...

  7. Lucky Array CodeForces - 121E (线段树,好题)

    题目链接 题目大意: 定义只含数字$4,7$的数字为幸运数, 给定序列, 区间加正数, 区间询问多少个幸运数 题解: 对于每一个数, 求出它和第一个比它大的幸运数之差, 则问题转化为区间加,查询$0$ ...

  8. Educational Codeforces Round 21 D.Array Division(二分)

    D. Array Division time limit per test:2 seconds memory limit per test:256 megabytes input:standard i ...

  9. Codeforces 754A Lesha and array splitting(简单贪心)

    A. Lesha and array splitting time limit per test:2 seconds memory limit per test:256 megabytes input ...

随机推荐

  1. glance image-create --name "linux-core-mini-01" --file /cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --progress --visibility public

    glance image-create --name "linux-core-mini-01" --file /cirros-0.3.4-x86_64-disk.img --dis ...

  2. Appleman and a Sheet of Paper

    题意: 给一纸条,两种操作: 1.将左侧长度为$x$的纸条向右翻折. 2.询问位于$[l,r]$的纸条总长度. 解法: 考虑启发式,每一次一个小纸条折叠我们可以看做是一次合并,如果我们每一次将较小的纸 ...

  3. conditon_variable(条件变量)用于线程间同步

    conditon_variable(条件变量)用于线程间同步 condition_variable有5个函数,函数名及对应的功能如下: wait阻塞自己,等待唤醒 wait_for阻塞自己,等待唤醒, ...

  4. [工作笔记]JDK版本不同导致的SSL异常

    前言 遇到这个问题得说一下笔者的开发环境,笔者所在公司,平时开发用的web容器是jboss,使用的JDK是oracle的JDK,但是测试和生产环境用的是WAS,JDK用的是IBM的JDK,由于项目的不 ...

  5. 【Data Structure & Algorithm】在排序数组中查找和为定值的两个数

    在排序数组中查找和为定值的两个数 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字,要求时间复杂度是O(n).如果有多对数字的和等于输入的数字,输出 ...

  6. UVaLive 3695 Distant Galaxy (扫描线)

    题意:给平面上的 n 个点,找出一个矩形,使得边界上包含尽量多的点. 析:如果暴力那么就是枚举上下边界,左右边界,还得统计个数,时间复杂度太高,所以我们考虑用扫描线来做,枚举上下边界, 然后用其他方法 ...

  7. ios NSFileManager创建目录、文件

    NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *str1 = NSHomeDirectory(); _fi ...

  8. 20道Java精选面试必问题(附详细解答),还有什么拿不到的offer

    1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Java被 ...

  9. IT兄弟连 JavaWeb教程 Servlet会话跟踪 经典案例

    案例需求:编写一个servlet,可以向session中存放一个消息,再编写一个servlet可以从session取得session中存放的这个消息. 案例实现: package com.xdl.se ...

  10. scrapy 安装错误

    真的是各种坑啊,哎 安装显示 Building wheel for twisted (setup.py) ... error 解决方法: https://askubuntu.com/questions ...