1. 程式人生 > >NOIP2017 D1T2 時間復雜度

NOIP2017 D1T2 時間復雜度

== sum fine 復雜 != i++ 棧模擬 define 每次

NOIP2017 D1T2 時間復雜度

本題用棧模擬,我感覺會寫中綴表達式求值那種難度題的人就可以在NOIP上A了此題了。(雖然我掛了,涼了,我也要用嘶啞的聲音呼喊出:這題真水)

用棧pop和push的時候 維護 有效循環層數、無效循環(l>r)層數、相同字母 ,每次退棧時更新答案,就OK了 。

還有就是字符串的讀入和處理不能寫掛。

(在判定ERR之後把剩下的東西讀幹凈再走)

#include<bits/stdc++.h>
#define INF 1000000007
using namespace std;
int T,head,N,Map[200],cnt1,cnt2,res,ans;//
cnt1有效循環 cnt2無效循環 char s[50]; struct Node{ char c;int a,b; }Stack[200]; int getint(){ int sum=0,i=0,len=strlen(s); while(s[i]<0||s[i]>9)i++; while(s[i]>=0&&s[i]<=9&&i<=len){sum=sum*10+s[i]-0;i++;} return sum; } void Pop(){ Map[Stack[head].c
-a+1]=0; if(Stack[head].a>Stack[head].b)cnt2--; if(Stack[head].b==INF&&Stack[head].a!=INF&&cnt2==0)cnt1--; head--; } void Push(Node x){ Map[x.c-a+1]=1; if(x.a>x.b)cnt2++; else if(x.b==INF&&x.a!=INF&&cnt2==0)cnt1++,res=max(res,cnt1); Stack[
++head]=x; } void ToError(int x){ for(int i=x+1;i<=N;i++){ scanf("%s",s); if(s[0]==F){scanf("%s",s);scanf("%s",s);scanf("%s",s);} } } int main() { scanf("%d",&T); while(T--){ while(head>0)Pop(); res=0; scanf("%d%s",&N,s); if(s[2]==n){ans=getint();if(!ans)ans=1;} else ans=0; for(int i=1;i<=N;i++){ scanf("%s",s); if(s[0]==F){ Node x; scanf("%s",s);x.c=s[0]; scanf("%s",s); if(s[0]==n)x.a=INF;else x.a=getint(); scanf("%s",s); if(s[0]==n)x.b=INF;else x.b=getint(); if(Map[x.c-a+1]){ ToError(i); puts("ERR");goto New; } Push(x); } else{ if(head==0){ ToError(i); puts("ERR");goto New; } Pop(); } } if(head>0)puts("ERR"); else if(ans==res)puts("Yes"); else puts("No"); New: ; } return 0; }

NOIP2017 D1T2 時間復雜度