首页 > 其他分享 >[题解]P3952 [NOIP2017 提高组] 时间复杂度

[题解]P3952 [NOIP2017 提高组] 时间复杂度

时间:2024-10-16 19:13:02浏览次数:7  
标签:NOIP2017 s2 maxx dep 题解 s4 s3 skip P3952

P3952 [NOIP2017 提高组] 时间复杂度

我们把循环的嵌套关系看做树形结构,梳理一下\(3\)种情况:

  • 直接跳过当前子树:

    • \(x,y\in\mathbb{N}\),且\(x>y\)。
    • \(x=\tt{"n"},y\in\mathbb{N}\)。
  • 不跳过,并在处理完所有子节点后追加\(n\)的时间复杂度:

    • \(x\in\mathbb{N},y=\tt{"n"}\)。
  • 不跳过,并不追加复杂度:

    • 除上面\(2\)种以外的情况。

直接输入的同时处理即可,跳过子树用的方法是记录一个\(skip\),当需要跳过某个子树时,就把当前调用深度\(dep\)赋给\(skip\),在\(dep<skip\)之前,只进行输入和根据函数类型更改\(dep\)。

注意出现错误后仍需完成剩下的输入。

点击查看代码
#include<bits/stdc++.h>
#define L 110
#define int long long
using namespace std;
int t,dep,maxx[L],add[L],n,top;
bitset<26> vis;
char s2,st[L];
string com,s1,s3,s4;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>t;
	while(t--){
		bool err=0;
		int skip=LLONG_MAX;
		maxx[0]=dep=top=0;
		vis=0;
		cin>>n>>com;
		int i=1;
		for(;i<=n;i++){
			cin>>s1;
			if(s1=="E"){
				if(!dep){err=1;break;}
				if((--dep)>=skip) continue;
				if(skip!=LLONG_MAX){
					skip=LLONG_MAX;
					continue;
				}
				maxx[dep]=max(maxx[dep],maxx[dep+1]+add[dep+1]);
				vis[st[top--]-'a']=0;
			}else{
				cin>>s2>>s3>>s4;
				if(vis[s2-'a']){err=1;break;}
				if((++dep)>=skip) continue;//如果dep>=skip则不执行 
				if((s3=="n"&&s4!="n")||(s3!="n"&&s4!="n"&&stoi(s3)>stoi(s4))){
					skip=dep;
					continue;
				}
				vis[s2-'a']=1,st[++top]=s2;
				add[dep]=(s3!="n"&&s4=="n"),maxx[dep]=0;
			}
		}
		if(dep) err=1;
		if(err){
			for(i++;i<=n;i++){
				cin>>s1;
				if(s1!="E") cin>>s2>>s3>>s4;
			}
			cout<<"ERR\n";
		}else{
			string ans=((!maxx[0])?"O(1)":"O(n^"+to_string(maxx[0])+")");
			cout<<(ans==com?"Yes\n":"No\n");
		}
	}
	return 0;
}

标签:NOIP2017,s2,maxx,dep,题解,s4,s3,skip,P3952
From: https://www.cnblogs.com/Sinktank/p/18468473

相关文章

  • 【题解】[2023 合肥蜀山初中] 旅行(travel)
    题目传送门题目大意有一个\(n\)个点\(m\)条边的有向图组成的城市,每条边可以是骑行边或公共交通边,公共交通边只能走一条,边是从\(u_i\)到\(v_i\)的有向边,需要花费\(time_i\)的时间,求\(1\)到其他点的最短路径。思路分析有一个很巧妙的思路叫分层图,它的思路是因为只能......
  • Excel DLL丢失?Excel DLL文件下载指南及常见问题解决方案
    当您在使用MicrosoftExcel时遇到提示DLL文件丢失或损坏的情况,这可能会影响软件的正常运行。为了帮助您解决这一问题,本文提供了ExcelDLL文件的下载指南,并针对常见问题给出了解决方案。一、ExcelDLL文件下载指南确定缺失的DLL文件:首先,您需要确定是哪个DLL文件丢失或损坏......
  • 数据结构1系列题解前瞻
    A.线段树分裂算法:线段树、(平衡树?)板子题,不多做评价。但是开发空间很大,我的写法在洛谷题解上没找到,导致当时想贺题解没贺成。B.三元上升子序列算法:线段树、树状数组、分块、(CDQ分治?)二维偏序板子,开发空间极大,想怎么写就怎么写。C.STEP算法:线段树、分块线段树维护子区间信......
  • P1941 NOIP2014 提高组 飞扬的小鸟 题解
    P1941NOIP2014提高组飞扬的小鸟分析背包经典演变问题玩得挺花。设\(f[i][j]\)表示到达\((i,j)\)的时候的最小点击次数。题目中对于每一个\(i\)有两种处理:点击与不点击(重点:点击可以叠加)。所以,对于点击,我们可以像完全背包一样转移,而不点击就按照01背包转移。对于管......
  • [NOI2020] 美食家 题解
    属于是将矩阵快速幂的绝大部分技巧用到了极致的一道题。暴力部分首先我们先考虑一个普通DP。定义\(dp_{t,i}\)表示在时间为\(t\)时到达点\(i\)可以得到的愉悦值之和的最大值。显然有\((i,j)\inE\todp_{t+w,j}=\max(dp_{t,i}+c_j)\)。特判一下当前节点有美食节的情......
  • 洛谷 P5175 数列 题解
    纯纯数学题。看到\(n\le10^{18}\)不难想到矩乘,但是\(\log_210^{18}\approx60\),再加上\(T=30000\)的多测,运算量已经来到了\(1.8\times10^6\),所以我们最多有一个\(\sqrt[3]{\frac{1.5\times10^8}{6\times10^6}}\approx4\)的矩阵。\[\becausea_i=xa_{i-1}+ya_{......
  • Project Euler 588 题解
    这玩意好像甚至有递推式……不太懂(为什么是图片?cnblogs第一个公式没渲染成功)时间复杂度是\(O(4^{\degF}\logK)\)的。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmaxn=100;intf[17][maxn],cur[10],al[4];intcalc(intK){ //cer......
  • 题解:[SNCPC2019] Pick Up
    ProblemLink[SNCPC2019]PickUp题意给出甲的坐标和速度,乙的坐标和速度,商场的坐标,可以让乙去接甲,求甲前往商场的最短用时。Solution分类讨论。思考乙是否要去接甲。这个很简单,令\(ans1\)为甲自己出发耗时,\(ans2\)为乙接甲耗时,两者取最小值即可。\(ans1\)很好算,那么\(......
  • P3794 签到题IV 题解
    题目传送门前置知识最大公约数解法\(\gcd\)和\(\operatorname{or}\)在固定左端点的情况下至多会变化\(O(\logV)\)次。以\(\gcd\)为例,考虑求出所有的四元组\((l,r,x,val)\)表示\(\foralli\in[l,r],\gcd\limits_{j=i}^{x}\{a_{j}\}=val\)。本题中因为\(x\)......
  • CF1458D Flip and Reverse 题解
    思路由于它要求\(\text{01}\)数量相等,我们可以考虑站在前缀和的角度看待这个问题。我们将\(0\)看作负一,\(1\)看作一。可以把它化成一个折线图(方便观察)。观察一下它的操作实际上在干什么。容易发现,在折线图上,我们把操作的\([l,r]\)的整段折线reverse了一遍。同样的,......