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 }
原文地址:https://www.cnblogs.com/hchlqlz-oj-mrj/p/6003982.html