华师一附中OI组

标题: NOIP2017 时间复杂度 洛谷3952(Day1 T2) [打印本页]

作者: WWX    时间: 2018-6-5 17:44
标题: NOIP2017 时间复杂度 洛谷3952(Day1 T2)
https://www.luogu.org/problemnew/show/P3952
题目很长,就不贴了
一道没有什么营养的大模拟

作者: WWX    时间: 2018-6-5 17:45
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <cstdio>
  5. using namespace std;

  6. int T,L,MX,CNT,top;
  7. bool ERR_;
  8. struct Node
  9. {
  10.     int id,step;
  11.     bool naive;
  12. } data[110];
  13. char s[10],s1[10],s2[10];
  14. bool use[30];
  15. inline int read()
  16. {
  17.     int x=0;
  18.     char ch=getchar();
  19.     while(ch<'0'||ch>'9')
  20.         ch=getchar();
  21.     while(ch>='0'&&ch<='9')
  22.     {
  23.         x=x*10+ch-'0';
  24.         ch=getchar();
  25.     }
  26.     return x;
  27. }
  28. int main()
  29. {
  30.     //freopen("complexity.in","r",stdin);
  31.     //freopen("complexity.out","w",stdout);
  32.     T=read();
  33.     while(T--)
  34.     {
  35.         MX=0;
  36.         top=0;
  37.         CNT=0;
  38.         ERR_=false;
  39.         memset(use,0,sizeof(use));
  40.         L=read();
  41.         scanf("%s",&s[0]);
  42.         if(s[2]=='1')
  43.             CNT=0;
  44.         else for(int i=4; s[i]>='0'&&s[i]<='9'; i++)
  45.                 CNT=CNT*10+s[i]-'0';
  46.         while(L--)
  47.         {
  48.             char ch=getchar();
  49.             while(ch!='F'&&ch!='E')
  50.                 ch=getchar();
  51.             if(ch=='E')
  52.             {
  53.                 if(ERR_)
  54.                     continue;
  55.                 if(!top)
  56.                     ERR_=true;
  57.                 if(!ERR_)
  58.                 {
  59.                     use[data[top].id]=false;
  60.                     top--;
  61.                 }
  62.             }
  63.             else
  64.             {
  65.                 while(ch<'a'||ch>'z')
  66.                     ch=getchar();
  67.                 if(!ERR_)
  68.                 {
  69.                     if(use[ch-'a'])
  70.                         ERR_=true;
  71.                 }
  72.                 if(!ERR_)
  73.                 {
  74.                     top++;
  75.                     data[top].id=ch-'a';
  76.                     use[data[top].id]=true;
  77.                 }
  78.                 for(int i=0; i<=3; i++)
  79.                     s1[i]=s2[i]='?';
  80.                 scanf("%s%s",&s1[0],&s2[0]);
  81.                 if(ERR_)
  82.                     continue;
  83.                 int L=0,R=0;
  84.                 if(s1[0]=='n')
  85.                     L=100;
  86.                 else for(int i=0; s1[i]>='0'&&s1[i]<='9'; i++)
  87.                         L=L*10+s1[i]-'0';
  88.                 if(s2[0]=='n')
  89.                     R=100;
  90.                 else for(int i=0; s2[i]>='0'&&s2[i]<='9'; i++)
  91.                         R=R*10+s2[i]-'0';
  92.                 if(L>R)
  93.                     data[top].naive=true;
  94.                 else data[top].naive=data[top-1].naive;
  95.                 if(L<100&&R==100&&!data[top].naive)
  96.                     data[top].step=data[top-1].step+1;
  97.                 else data[top].step=data[top-1].step;
  98.                 MX=max(MX,data[top].step);
  99.             }
  100.         }
  101.         if(top)
  102.             ERR_=true;
  103.         if(ERR_)
  104.             cout<<"ERR"<<endl;
  105.         else if(MX==CNT)
  106.             cout<<"Yes"<<endl;
  107.         else cout<<"No"<<endl;
  108.     }
  109.     return 0;
  110. }
复制代码

作者: 吴语林    时间: 2018-7-30 00:08
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <map>
  7. #include <string>
  8. #include <vector>
  9. #include <queue>
  10. #include <stack>
  11. using namespace std;
  12. char c[1000],code[100];
  13. int n,w,le;
  14. int main()
  15. {
  16.         int t;
  17.         scanf("%d",&t);
  18.         while(t--)
  19.         {
  20.                 scanf("%d ",&n);
  21.                 gets(c);
  22.                 w=0,le=strlen(c);
  23.                 if(c[2]=='n')
  24.                         for(int i=4;i<le&&isdigit(c[i]);i++)
  25.                                 (w*=10)+=(c[i]-'0');
  26.                 stack<int> s;
  27.                 int e=1,book[26]={0},ef[26]={0},now=0,flag=-1,res=0;
  28.                 for(int i=1;i<=n;i++)
  29.                 {
  30.                         gets(code);
  31.                         if(code[0]=='F')
  32.                         {
  33.                                 int k=code[2]-'a';
  34.                                 s.push(k);
  35.                                 if(!book[k])
  36.                                         book[k]=1;
  37.                                 else
  38.                                 {
  39.                                         printf("ERR\n");
  40.                                         e=0;
  41.                                         for(int j=i+1;j<=n;j++)
  42.                                                 gets(code);
  43.                                         break;
  44.                                 }
  45.                                 int a=0,b=0,j=4;
  46.                                 for(j=4;isdigit(code[j])||code[j]=='n';j++)
  47.                                 {
  48.                                         if(code[j]=='n')
  49.                                                 a=1000000;
  50.                                         (a*=10)+=(code[j]-'0');
  51.                                 }
  52.                                 j++;
  53.                                 for(j;isdigit(code[j])||code[j]=='n';j++)
  54.                                 {
  55.                                         if(code[j]=='n')
  56.                                                 b=1000000;
  57.                                         (b*=10)+=(code[j]-'0');
  58.                                 }
  59.                                 if(b-a>1000)
  60.                     if(flag==-1)
  61.                                         {
  62.                                 now++;
  63.                                                 res=max(res,now);
  64.                                                 ef[k]=true;
  65.                                         }
  66.                                 if(a>b)
  67.                     if(flag==-1) flag=k;
  68.                         }
  69.                         else if(code[0]=='E')
  70.                         {
  71.                                 if(s.empty())
  72.                                 {
  73.                                         printf("ERR\n");
  74.                                         e=0;
  75.                                         for(int j=i+1;j<=n;j++)
  76.                                                 gets(code);
  77.                                         break;
  78.                                 }
  79.                 int k=s.top();
  80.                 s.pop();book[k]=false;
  81.                 if(flag==k)
  82.                                         flag=-1;
  83.                 if(ef[k])
  84.                                 {
  85.                     ef[k]=false;
  86.                     now--;
  87.                 }
  88.                         }
  89.                 }
  90.                 if(e)
  91.                 {
  92.                         if(s.size())
  93.                                 printf("ERR\n");
  94.                         else if(res==w)
  95.                                 printf("Yes\n");
  96.                         else
  97.                                 printf("No\n");       
  98.                 }
  99.         }
  100.         return 0;
  101. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2