洛谷P3952 时间复杂度

题目
先判断是否有解,然后开两个栈,分别存进入递归时间复杂度为O(1)的变量,和时间复杂度为O(n)的变量,最后取最大值。

#include <bits/stdc++.h>
using namespace std;
int T;
int tong[1000100];
stack <int> s, s2;
int main()
{
//	freopen("Time.txt", "w", stdout);
	scanf("%d", &T);
	while (T--)
	{
		memset(tong, 0, sizeof(tong)); 
		while (s.size()) s.pop();
		int L, flag = 0, F1 = 0, E1 = 0, ans = 0, now = 0; string TI;//flag为2则不进入 
		cin >> L >> TI;	 int len = TI.size();
		if (TI[2] == '1')
		 	ans = 0;
		else 
			for (int i = 4; i < len; i++)
			{
				if (TI[i] >= '0' && TI[i] <= '9')
					ans = ans * 10 + TI[i] - '0';
			}
		for (int i = 1; i <= L; i++)
		{		
			char c1;
			cin >> c1;
			if (c1 == 'F')
			{	
				F1++; 
				string st, ed; char bianliang;
				cin >> bianliang >> st >> ed;
				if (tong[bianliang - '0'])//如果已经进入了该变量,就判断ERR 
					flag = 1;//以后的都不计入时间复杂度 (
				if (st[0] == 'n' && ed[0] != 'n' && flag != 1)
				{
					/*if (ed[0] == 'n')
						now += 0;
					else if (!flag)
						now++;*/
					flag = 2;
					tong[bianliang - '0'] = 0;
				}	
				else if (st[0] != 'n') //说明此时st是数 
				{
					int sta = 0, eda = 0;
					for (int i = 0; i < st.size(); i++)
						if (st[i] <= '9' && st[i] >= '0')
							sta = sta * 10 + st[i] - '0';
					if (ed[0] == 'n' && !flag)
					{
						tong[bianliang - '0'] = 1;
						s.push(bianliang - '0');	
						int SI = s.size();
						now = max(now, SI);
					}
					else
					{
						for (int i = 0; i < ed.size(); i++)
							if (ed[i] <= '9' && ed[i] >= '0')
								eda = eda * 10 + ed[i] - '0';
						if (sta > eda && flag != 1) flag = 2, s.push(214748);
						if (sta <= eda) tong[bianliang - '0'] = 1, s2.push(bianliang - '0');// s2表示进去但不加时间复杂度的 
					}
				}
		 	}
		 	else
		 	{
			 	E1++; int ha = 0; 
			 	if (s.size() )
					ha = s.top(), s.pop();
				else if (!s.size() && s2.size() ) 
					ha = s2.top(), s2.pop();
				tong[ha] = 0;
				if (ha == 214748 && flag != 1)
					flag = 0;
			 		
		 	}
	 	}
	 	if (F1 != E1 || flag == 1)
	 		printf("ERR\n");
	 	else 
		 {
		 	if (ans != now)
		 		printf("No\n", ans, now);
		 	else 
		 	printf("Yes\n");	
		 }
 	}
	return 0;
}

posted @ 2019-10-08 13:50  DAGGGGGGGGGGGG  阅读(172)  评论(0编辑  收藏  举报