我对模拟的理解: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. URAL 1010 Discrete Function【简单暴力】

    链接:  http://acm.timus.ru/problem.aspx?space=1&num=1010 http://acm.hust.edu.cn/vjudge/contest/vie ...

  2. cocos2dx使用cocostudio导出的ui

    local uilocal function createLayerUI() if not ui then ui=cc.Layer:create(); createLayerUI=nil; end r ...

  3. CMDB的四种模式

    为什么要有CMDB? CMDB --Configuration Management Database 配置管理数据库. 1.为了实现资产的自动采集,资产的自动更新, 为了搭建公司自动化平台的基础则需 ...

  4. 7 Javascript:表单与验证-非空验证

    表单提交前要检查数据的合法性 在要对表单里的数据进行验证的时候,能够利用getElementById()来訪问网页上不论什么一个元素 每一个表单域都有一个form对象,可被传给不论什么验证表单数据的函 ...

  5. Linux软连接和硬连接

    软连接 命令: ln -s 原文件 目标文件 特征: 1.相当于windows的快捷方式 2.只是一个符号连接,所以软连接文件大小都很小 3.当运行软连接的时候,会根据连接指向找到真正的文件,然后执行 ...

  6. centos7 使用postgres

    1: http://www.cnblogs.com/think8848/p/5877076.html 2:http://blog.csdn.net/xuaa/article/details/52262 ...

  7. java基础入门之数组循环初始化

    /* Name:数组循环化 Power by Stuart Date:2015-4-23 */public class ArrayTest02{ public static void main (St ...

  8. statu 设置

    DATA: itab TYPE TABLE OF sy-ucomm. APPEND 'DELE' TO itab. APPEND 'PICK' TO itab. SET PF-STATUS 'STA3 ...

  9. PHP实现今天是星期几的几种写法

    今天是星期几的写法有很多,本文整理了常用的三种. 代码如下:  // 第一种写法 $da = date("w");  if( $da == "1" ){  ec ...

  10. Kindeditor 编辑区样式结构

    ke-container   ke-toolbar   ke-edit   ke-edit-iframe   ke-edit-area   ke-statusbar