[LUOGU] P3952 时间复杂度
其实,也没那么难写
这种模拟题,仔细分析一下输入格式,分析可能的情况,把思路写在纸上,逐步求精,注意代码实现
主要思路就是算一个时间复杂度,和给出的复杂度比较,这就先设计一个函数把给出的复杂度由字符串形式化为数字形式
然后开始分析,对于F:
- 检查变量合法
- 分类:常量-常量和n-n:O(1),常量-n:O(n),n-常量:无法进入,记为0,特殊标记一个slay
3.压栈:栈内记录变量名和贡献的复杂度,用map标记变量为使用过
对于E: - 检查栈空
- 如果没有slay标记就更新答案
- 弹栈,清空变量使用
一个问题:ERR不能直接返回,剩下的程序还是要读完的
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<map>
using namespace std;
int n;
string ostring;
struct Node{
string var;
int o,slay;
Node(string s="",int _=0,int l=0){var=s;o=_;slay=l;}
};
int ans,cur;
Node sta[10000];
int top;
map<string,int> mp;
int checkO(string s){//return the O of s
if(s=="O(1)") return 0;
int ret=0,p=0;char c;
while(c=s[p++],!isdigit(c));
while(isdigit(c)){
ret=ret*10+c-'0';
c=s[p++];
}
return ret;
}
int push(string var,string st,string ed){
if(mp[var]==1)return -1;
mp[var]=1;
if(st=="n"&&ed=="n") return 0;
if(st=="n") return -2;//slay =1
if(ed=="n") return 1;
int l=0,r=0;
int len=st.size();
for(int i=0;i<len;i++){
l*=10;
l+=st[i]-'0';
}
len=ed.size();
for(int i=0;i<len;i++){
r*=10;
r+=ed[i]-'0';
}
if(l<=r) return 0;
else return -2;
}
int pop(){
if(!top) return -1;
Node tmp=sta[top--];
mp[tmp.var]=0;
if(!tmp.slay) ans=max(ans,cur);
cur-=tmp.o;
}
int solve(int len){
int fail=0;
ans=0;cur=0;top=0;mp.clear();
int tmp=0,sl=0;
string s,var,st,ed;
for(int i=1;i<=len;i++){
sl=0;
cin>>s;
if(s=="F"){
cin>>var>>st>>ed;
tmp=push(var,st,ed);
if(tmp==-1) fail=1;
if(tmp==-2) sl=1,tmp=0;
if(top>0) sl|=sta[top].slay;
sta[++top]=Node(var,tmp,sl);
cur+=tmp;
}else{
tmp=pop();
if(tmp==-1) fail=1;
}
}
if(top) return -1;
if(fail) return -1;
return ans;
}
int main(){
int T;
cin>>T;
while(T--){
top=0;ans=0;cur=0;
cin>>n>>ostring;
int aim=checkO(ostring);
int res=solve(n);
if(res==-1) {puts("ERR");continue;}
if(aim==res) {puts("Yes");continue;}
puts("No");
}
return 0;
}
[LUOGU] P3952 时间复杂度的更多相关文章
- luogu P3952 时间复杂度 模拟
题目链接 luogu P3952 时间复杂度 题解 直接模拟即可 注意不要直接return 我真是naive ...... 代码 #include<map> #include<sta ...
- 【luogu P3952 时间复杂度】 题解
对于2017 D1 T2 这道题 实实在在是个码力题,非常考验耐心. 其实大体的思路并不是非常难想出来,但是要注意的小细节比较多. 题目链接:https://www.luogu.org/problem ...
- [NOIp2017] luogu P3952 时间复杂度
跪着看评测很优秀. 题目描述 给你若干个程序,这些程序只有 For 循环,求这些程序的时间复杂度. Solution 大模拟.讲下细节. flag[i]flag[i]flag[i] 表示第 iii 位 ...
- P3952 时间复杂度
P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机 ...
- 洛谷 P3952 时间复杂度 解题报告
P3952 时间复杂度 题目描述 小明正在学习一种新的编程语言A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会 ...
- 洛谷 - P3952 - 时间复杂度 - 模拟
https://www.luogu.org/problemnew/show/P3952 这个模拟,注意每次进入循环的时候把新状态全部入栈,退出循环的时候就退栈. 第一次就错在发现ERR退出太及时,把剩 ...
- 洛谷P3952 时间复杂度【字符串】【模拟】
题目描述 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序 ...
- LOJ P3952 时间复杂度 noip 暴力 模拟
https://www.luogu.org/problemnew/show/P3952 模拟,日常认识到自己zz. #include<iostream> #include<cstdi ...
- 洛谷P3952 时间复杂度
大毒瘤...... 时隔快半年我终于花了两个小时堪堪A掉这一题...果然我还没有准备好. 想法:用DFS模拟递归. 时间复杂度的处理:每层循环取max,然后相加. 最大难点:各种繁杂而令人发指的特判. ...
随机推荐
- jQuery EasyUI/TopJUI创建日期时间输入框
jQuery EasyUI/TopJUI创建日期时间输入框 日期时间输入框组件 HTML 和日期输入框类似,日期时间输入框允许用户选择日期和指定的时间并按照指定的输出格式显示.相比日期输入框,它在下拉 ...
- Uvalive-4494-(数位dp)
题意:求a->b中的二进制出现过多少个1,很显然的数位dp,对于某一位来说,如果这位是0,那么dp[i]=dp[i-1] 如果这一位是1 那么dp[i]=dp[i-1]+1<<(p ...
- kindeditor编辑器和图片上传独立分开的配置细节
关于kindeditor编辑器上传按钮的异步加载最关键的部署问题,它的上传图片的组件都已经封装得很好了的,只需要监听到页面按钮的点击事件给编辑器对象传递一些对应的初始化参数即可显示图片上传的弹窗实现异 ...
- HDU 3530Subsequence(单调队列)
题意 题目链接 给出$n$个数,找出最长的区间,使得区间中最大数$-$最小数 $>= m$ 且$<= k$ Sol 考虑维护两个单调队列. 一个维护$1 - i$的最大值,一个维护$1 - ...
- MATLAB 添加自定义的模块到simulink库浏览器
在simulink 浏览器窗口File->new->library,打开编辑窗口,将自定义的模块托人编辑窗口.保存为DC_MOTOR_sub_lib.mdl文件. 新建function文件 ...
- Lucene-如何编写Lucene程序
Lucene版本:7.1 使用Lucene的关键点 创建文档(Document),添加文件(Field),保存了原始数据信息: 把文档加入IndexWriter: 使用QueryParser.pars ...
- 修复使用<code>XmlDocument</code>加载含有DOCTYPE的Xml时,加载后增加“[]”字符的错误
C# LINQ TO XML - Remove “[]” characters from the DTD header http://stackoverflow.com/questions/12358 ...
- SQLServer 2012 报表服务部署配置(1)
由于最近客户项目中,一直在做SQL Server 方面配置.就给大家概况简述一下 报表服务安装及遇到问题.安装和运行 SQL Server 2012 的微软原厂都有最低硬件和软件要求,对于我们大多数新 ...
- Linux之bash shell的学习
1.什么是bash shell bash 是Bourne Again Shell的简称,是从unix系统中的sh发展而来,是用户和偶Linux内核交互的工具,用户通过bash操作内核完成系统的使用和 ...
- LINQ 组合查询 和分页查询的使用
前端代码 <%@ Page Language="C#" AutoEventWireup="true" Debug="true" Cod ...