题目: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 }