• HDU 5929 Basic Data Structure


    题目:Basic Data Structure

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5929

    题意:t个测试数据,每个数据给出一个m表示操作数量,操作分为4种:PUSH x(x:0或1),POP,REVERSE(翻转栈里面的数),QUERY(假使栈内的数一个个出栈,并按出栈顺序将他们与非起来,问最终结果(注意,并不是真的出栈))

    思路:

      做题的时候忘记了与非是按出栈顺序来的,一直按栈底到栈顶的顺序来,WA到死。。。

      根据与非的性质,1、0与非0都为1,所以查询的时候就判断最近0的位置,然后得出1的数量就可以了。

      思路比较简单,用一个600000的数组存数,用l、r表示栈底和栈顶,用f==1表示l 是栈底,f==0表示l 是栈顶,初始l=r=300000、f=1,如果要翻转,可以直接把f^=1,当f=1时入栈是r++,f=0时入栈是l--,然后查询时就是找最近的0就可以了,二分可以快速查找,注意细节。

    AC代码:

      1 #include<stdio.h>
      2 int num[600000];
      3 int w[600000];
      4 int l,r;
      5 int f;
      6 void push()
      7 {
      8   int x;
      9   scanf("%d",&x);
     10 
     11   if(f)
     12   {
     13     if(l==r)
     14     {
     15       num[++r]=x;
     16       w[r]=x;
     17     }
     18     else
     19     {
     20       num[r+1]=num[r]+x;
     21       w[++r]=x;
     22     }
     23   }
     24   else
     25   {
     26     if(l==r)
     27     {
     28       num[l]=x;
     29       w[l--]=x;
     30     }
     31     else
     32     {
     33       num[l]=num[l+1]-w[l+1];
     34       w[l--]=x;
     35     }
     36   }
     37 }
     38 void pop()
     39 {
     40   if(l==r) return ;
     41   if(f) r--;
     42   else l++;
     43 }
     44 int er1(int l,int r)
     45 {
     46   int x=num[l], y=l;
     47   while(l<r)
     48   {
     49     int mid = (l+r)>>1;
     50     if(num[mid]-x<mid-y)
     51     {
     52       r = mid;
     53     }
     54     else l = mid + 1;
     55   }
     56   return l;
     57 }
     58 int er2(int l,int r)
     59 {
     60   int x=num[r], y=r;
     61   while(l<r)
     62   {
     63     int mid = (l+r)>>1;
     64     if(x-num[mid]<y-mid)
     65     {
     66       l = mid + 1;
     67     }
     68     else r = mid;
     69   }
     70   return l;
     71 }
     72 void query()
     73 {
     74   if(l==r) printf("Invalid.
    ");
     75   else if(f==0)
     76   {
     77     if(w[r]==0)
     78     {
     79       if(l+1==r)
     80         printf("0
    ");
     81       else printf("1
    ");
     82     }
     83     else
     84     {
     85       int p = er2(l+1,r);
     86       if(p==l+1)
     87       {
     88         if(w[p]==0) p = r-p;
     89         else p=r-p+1;
     90       }
     91       else p = r-p+1;
     92       printf("%d
    ",p%2==0?0:1);
     93     }
     94   }
     95   else
     96   {
     97     if(w[l+1]==0)
     98     {
     99       if(l+1==r)
    100         printf("0
    ");
    101       else printf("1
    ");
    102     }
    103     else
    104     {
    105       int p = er1(l+1,r);
    106       if(p==r)
    107       {
    108         if(w[p]==0) p = p-l-1;
    109         else p = p-l;
    110       }
    111       else p = p-l;
    112       printf("%d
    ",p%2==0?0:1);
    113     }
    114   }
    115 }
    116 int main()
    117 {
    118   int t,cas=1,m,x;
    119   char s[10];
    120   scanf("%d",&t);
    121   while(t--)
    122   {
    123     l=r=300000;
    124     f=1;
    125     num[l]=w[l]=0;
    126     printf("Case #%d:
    ",cas++);
    127     scanf("%d",&m);
    128     while(m--)
    129     {
    130       scanf("%s",s);
    131       if(s[0]=='P')
    132       {
    133         if(s[1]=='U') push();
    134         else pop();
    135       }
    136       else if(s[0]=='R') f^=1;
    137       else query();
    138     }
    139   }
    140   return 0;
    141 }
  • 相关阅读:
    linux 杂类
    set
    C++ 基础 杂类
    linux 添加samba账户
    git 常用命令
    git 设置bitbucket 邮箱、用户
    C++ shared_ptr
    git 免密码配置
    2014的新目标
    为/Date(1332919782070)/转时间2013-09-23
  • 原文地址:https://www.cnblogs.com/hchlqlz-oj-mrj/p/6003982.html
Copyright © 2020-2023  润新知