我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html

题目传送门:https://www.luogu.org/problemnew/show/P3952

作为一个在现场没有切出这题后来才\(A\)掉的弱鸡,我深感惭愧。

主要是因为在\(Day1T1\)上浪费了太多时间,导致根本没有时间写这道模拟题————出考场后我是这样想的,我还以为要是有时间我就可以\(440\)了————所以\(Day1T2\)我爆零了。

什么?你说这种水题我怎么还爆零?前\(30\)分不是送给我的吗?

说起我爆零的原因都有些感到颜面扫地……作为八中的学生我居然没分清楚大小写。一看题目,瞬间被\(ERR\)吸引住了眼球,然后把\(Yes\)当作了\(YES\),把\(No\)当作了\(NO\)……

但是今天我也花了1个多小时,在有数据的情况下才A掉,说明我的思维还是窄了点,想的不够全面。\(440\)不存在的,当初就算没看错大小写也就只有\(370\)……

我们只需要用栈维护循环语句开头与结尾的匹配,并且维护“每个循环内的最高时间复杂度”就可以了。假设在最外面再套一个不存在的循环,那么该循环内的最高时间复杂度就是题目要求的答案。

要注意一个循环内如果有多个互不干扰的循环,要用所有互不干扰的循环的复杂度取max更新当前循环的复杂度

时间复杂度:\(O(n)\);

空间复杂度:\(O(n)\);

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int inf=2e9;//把变量n当作inf int n,T;
bool bo[30];//用来判断变量重名
char tim[20]; struct stence {
int Max;//在此层循环内的时间复杂度最多是n^Max
char opt[10],var[10],x[10],y[10];
}sta[200],s[200];//我用栈模拟,所有语句提前全部读完,不然我用solve会GG int trans(char *a) {//将字符串转成数字
if(a[1]=='n')return inf;
int num=0,len=strlen(a+1);
for(int i=1;i<=len;i++)
num=num*10+a[i]-'0';
return num;
} bool solve() {
int top=0,Maxtim=0;
for(int i=1;i<=n;i++) {
if(s[i].opt[1]=='F') {
if(bo[s[i].var[1]-'a'])return 0;
bo[s[i].var[1]-'a']=1;
sta[++top]=s[i];
}
else {
if(!top)return 0;
int a=trans(sta[top].x),b=trans(sta[top].y);
bo[sta[top].var[1]-'a']=0;
if(a>b)sta[top].Max=0;//不会进入当前循环
if(a!=inf&&b==inf)sta[top-1].Max=max(sta[top-1].Max,sta[top].Max+1);
else if(a<=b)sta[top-1].Max=max(sta[top-1].Max,sta[top].Max);//一定要记得写成a<=b而不是a<b,相等也是会进入循环的
if(top==1)Maxtim=max(Maxtim,sta[0].Max);
top--;
}
}
if(top)return 0;
if(Maxtim==0&&tim[3]=='1')puts("Yes");
else {
int num=0,len=strlen(tim+1);
for(int i=5;i<len;i++)
num=num*10+tim[i]-'0';
if(num==Maxtim)puts("Yes");
else puts("No");
}//判断正确与否
return 1;
} int main() {
scanf("%d",&T);
while(T--) {
scanf("%d%s",&n,tim+1);
memset(bo,0,sizeof(bo));//clear
sta[0].Max=0;//sta[0]是假设的不存在的最外层的循环,根据定义,sta[0].Max就是答案
for(int i=1;i<=n;i++) {
scanf("%s",s[i].opt+1);
if(s[i].opt[1]=='F')
scanf("%s%s%s",s[i].var+1,s[i].x+1,s[i].y+1);
}
if(!solve())puts("ERR");
}
return 0;
}

洛谷【P3952】NOIP2017提高组Day1T2时间复杂度的更多相关文章

  1. 洛谷P1311 [NOIP2011提高组Day1T2]选择客栈

    P1311 选择客栈 题目描述 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一 ...

  2. 洛谷 3953 NOIP2017提高组Day1 T3 逛公园

    [题解] 先建反向图,用dijkstra跑出每个点到n的最短距离dis[i] 设f[u][k]表示dis(u,n)<=mindis(u,n)+k的方案数.对于边e(u,v,w),走了这条边的话需 ...

  3. 洛谷P1967 [NOIP2013提高组Day1T2]货车运输

    P1967 货车运输 题目描述 A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过 ...

  4. 洛谷P1966 [NOIP2013提高组Day1T2]火柴排队

    P1966 火柴排队 题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi) ...

  5. NOIP 2017 提高组 day1t2 时间复杂度

    P3952 时间复杂度 标签 NOIp提高组 2017 时空限制 1000ms / 128MB 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂 ...

  6. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  7. 洛谷 P1025 & [NOIP2001提高组] 数的划分(搜索剪枝)

    题目链接 https://www.luogu.org/problemnew/show/P1025 解题思路 一道简单的dfs题,但是需要剪枝,否则会TLE. 我们用dfs(a,u,num)来表示上一个 ...

  8. 洛谷P1514 [NOIP2010提高组T4]引水入城

    P1514 引水入城 题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城 ...

  9. 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制

    P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...

随机推荐

  1. Win10 Edge浏览器 应用商店 IE浏览器 无法访问页面 0x8000FFFF 问题解决

  2. Difference Between ZIP and GZIP

    From: http://www.differencebetween.net/technology/difference-between-zip-and-gzip/ Summary: 1. GZIP ...

  3. Django导出excel中文乱码解决方案

    Django官方文档有关于怎么生成csv文件的方法 import csv from django.http import HttpResponse def some_view(request): # ...

  4. 关于js sort排序方法

    sort() 方法用于对数组的元素进行排序. 语法:arrayObject.sort(sortby):参数sortby可选.规定排序顺序.必须是函数. 当方法不带参数的时候,将按照字符编码顺序进行排序 ...

  5. 树莓派+pythonista实时监控系统

    客户端(pythonista) import ui from PIL import Image import socket, time, StringIO global closeFlat close ...

  6. basic--factory

    <?php /* 工厂模式: 由工厂类根据参数来决定创建出哪一种产品类的实例: 工厂类是指包含了一个专门用来创建其他对象的方法的类.所谓按需分配,传入参数进行选择,返回具体的类.工厂模式的最主要 ...

  7. mail

    mail.php  <?php require_once('class.phpmailer.php'); $mail = new PHPMailer(); //实例化 $mail->IsS ...

  8. 第二章 python中重要的数据结构(下)

    二.元组(tuple):不可变序列 跟list一样,也是一种序列,唯一不同的是,元组元素不能被修改,通常用(, ,)表示元组,也可以不加括号. #创建元组 >>> 1,2,3 (1, ...

  9. day6 装饰器总结

    装饰器:开放封闭原则,为一个函数加上新的功能,不改变原函数,不改变调用方式 def fun2(wtf): def fun3(): print('i am pythoner!!! ') wtf() re ...

  10. Android蓝牙串口通讯【转】

    本文转载自:http://blog.sina.com.cn/s/blog_631e3f2601012ixi.html Android蓝牙串口通讯 闲着无聊玩起了Android蓝牙模块与单片机蓝牙模块的 ...