题目名称 2865. [NOIP 2017]时间复杂度
输入输出 2017complexity.in/out
难度等级 ★★
时间限制 1000 ms (1 s)
内存限制 256 MiB
测试数据 10
题目来源 Gravatarcqw 于2017-11-13加入
开放分组 全部用户
提交状态
分类标签
模拟 NOIP/CSP
分享题解
通过:96, 提交:399, 通过率:24.06%
GravatarHarry Potter 100 0.000 s 0.00 MiB C++
Gravatar夜莺 100 0.000 s 0.00 MiB C++
GravatarQHY256 100 0.000 s 0.00 MiB C++
Gravatarignitedark 100 0.000 s 0.00 MiB C++
Gravatar增强型图元文件 100 0.000 s 0.00 MiB C++
Gravatarop_组撒头屯 100 0.000 s 0.00 MiB C++
Gravatar数声风笛ovo 100 0.000 s 0.00 MiB C++
Gravatar┭┮﹏┭┮ 100 0.000 s 0.00 MiB C++
Gravatarrvalue 100 0.002 s 0.32 MiB C++
GravatarHzoi_Hugh 100 0.003 s 0.29 MiB C++
本题关联比赛
近5年noip/csp题目回顾
关于 时间复杂度 的近10条评论(全部评论)
恶心
Gravatar┭┮﹏┭┮
2023-11-13 14:03 12楼
SYF大佬居然说要直接全for循环!
Gravatar夜莺
2020-02-24 20:49 11楼
然而本菜鸡还是A不了。。。。
GravatarShallowDream雨梨
2018-09-28 21:29 10楼
$NOIP2017$只得了50。。没有做过这么难的模拟。。。还是窝太了。。。
Gravatar_WA自动机
2018-05-20 00:50 9楼
回复 @rvalue :
你也是浪
Gravatarhzoi2017_nzy
2018-01-21 12:36 8楼
$NOIP$时打成"YES"和"NO"了,然后就爆零了。。。
下来改了5个字母,AC。。。
身败名裂
Gravatar小字、小瓶子
2017-12-02 22:53 7楼
$NOIP2017$留念 考场思路爆炸,并没有A掉这道水题T-T
GravatarHallmeow
2017-11-29 09:41 6楼
清零位置放错,才得了30分。。。。。。
GravatarAAAAAAAAAA
2017-11-26 20:26 5楼
QAQ菜死了
出栈减当前时间复杂度的时候没判上层有没有不执行的QAQ
感谢数据只卡了我 $20$ 分QAQ
Gravatarrvalue
2017-11-26 19:15 4楼
NOIP2017 留念!
GravatarHtBest
2017-11-24 20:05 3楼

2865. [NOIP 2017]时间复杂度

★★   输入文件:2017complexity.in   输出文件:2017complexity.out   简单对比
时间限制:1 s   内存限制:256 MiB

【题目描述】

小明正在学习一种新的编程语言 A++ ,刚学会循环语句的他激动地写了好多程序并给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序,于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。

A++ 语言的循环结构如下:

F i x y
    循环体
E

其中“F i x y”表示新建变量 $i$($i$ 变量 $i$ 不可与未被销毁的变量重名)并初始化为 $x$,然后判断 $i$ 和 $y$ 的大小关系,若 $i$ 小于等于 $y$ 则进入循环,否则不进入。每次循环结束后 $i$ 都会被修改成 $i +1$,一旦 $i$ 大于 $y$ 终止循环。

$x$ 和 $y$ 可以是正整数($x$ 和 $y$ 的大小关系不定)或变量 $n$。$n$ 是一个表示数据规模的变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数远大于 $100$。

“E”表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。

注:本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意义下“$\Theta$”的概念。

【输入格式】

输入文件第一行一个正整数 $t$,表示有 $t$($t \le 10$)个程序需要计算时间复杂度。每个程序我们只需抽取其中“F i x y”和“E”即可计算时间复杂度。注意:循环结构允许嵌套。

接下来每个程序的第一行包含一个正整数 $L$ 和一个字符串,$L$ 代表程序行数,字符串表示这个程序的复杂度,“O(1)”表示常数复杂度,“O(n^w)”表示复杂度为 $n^w$,其中 $w$ 是一个小于 $100$ 的正整数(输入中不包含引号),输入保证复杂度只有 O(1) 和 O(n^w) 两种类型。

接下来 $L$ 行代表程序中循环结构中的“F i x y”或者 “E”。

程序行若以“F”开头,表示进入一个循环,之后有空格分离的三个字符(串)i x y,其中 $i$ 是一个小写字母(保证不为“n”),表示新建的变量名,$x$ 和 $y$ 可能是正整数或 n ,已知若为正整数则一定小于 $100$ 。

程序行若以“E”开头,则表示循环体结束。

【输出格式】

输出文件共 $t$ 行,对应输入的 $t$ 个程序,每行输出“Yes”或“No”或者“ERR”(输出中不包含引号),若程序实际复杂度与输入给出的复杂度一致则输出“Yes”,不一致则输出“No”,若程序有语法错误(其中语法错误只有: ① F 和 E 不匹配 ②新建的变量与已经存在但未被销毁的变量重复两种情况),则输出“ERR”。

注意:即使在程序不会执行的循环体中出现了语法错误也会编译错误,要输出“ERR”。

【样例输入】

8
2 O(1)
F i 1 1
E
2 O(n^1)
F x 1 n
E
1 O(1)
F x 1 n
4 O(n^2)
F x 5 n
F y 10 n
E
E
4 O(n^2)
F x 9 n
E
F y 2 n
E
4 O(n^1)
F x 9 n
F y n 4
E
E
4 O(1)
F y n 4
F x 9 n
E
E
4 O(n^2)
F x 1 n
F x 1 10
E
E

【样例输出】

Yes
Yes
ERR
Yes
No
Yes
Yes
ERR

【样例解释】

第一个程序 i 从 $1$ 到 $1$ 是常数复杂度。

第二个程序 x 从 $1$ 到 $n$ 是 $n$ 的一次方的复杂度。

第三个程序有一个 F 开启循环却没有 E 结束,语法错误。

第四个程序二重循环,$n$ 的平方的复杂度。

第五个程序两个一重循环,$n$ 的一次方的复杂度。

第六个程序第一重循环正常,但第二重循环开始即终止(因为 $n$ 远大于 $100$,$100$ 大于 $4$)。

第七个程序第一重循环无法进入,故为常数复杂度。

第八个程序第二重循环中的变量 x 与第一重循环中的变量重复,出现语法错误②,输出 ERR。

【数据范围】

对于30%的数据:不存在语法错误,数据保证小明给出的每个程序的前 $L/2$ 行一定为以 F 开头的语句,第 $L/2+1$ 行至第 $L$ 行一定为以 E 开头的语句,$L \le 10$,若 $x$、$y$ 均为整数,$x$ 一定小于 $y$,且只有 $y$ 有可能为 n。

对于50%的数据:不存在语法错误,$L \le 100$,且若 $x$、$y$ 均为整数,$x$ 一定小于 $y$,且只有 $y$ 有可能为 n。

对于70%的数据:不存在语法错误,$L\le 100$。

对于100%的数据:$L \le 100$。