有一根笔直的玻璃管和若干小球,初始时玻璃管内是空的,每个小球都有一个权值x,不同小球的权值可能相同。
玻璃管和小球支持以下三个操作:
从玻璃管的右端放入一个小球
从玻璃管的左端取出一个小球
翻转玻璃管:玻璃管原来的左端变为现在的右端,原来的右端变为现在的左端。
现在要开始进行以下操作。
输入格式:
第一行一个正整数q(1<=q<=400000),表示对玻璃管和小球的操作次数,初始时,玻璃管为空。
接下来q行,
若是 1 x,则将一个权值为x的小球从玻璃管右端放入玻璃管(1<=x<=1000000)。
若是 2,则从玻璃管左端取出一个小球(若当前玻璃管为空,则忽略此操作)
若是 3,则翻转玻璃管
输出格式:
对于每个输入输出一行一个整数,为玻璃管左端小球和玻璃管右端小球的权值的异或值(这里的异或是按位异或,运算符为 ‘^’)。
若当前玻璃管为空,则输出-1
输入样例1:
5
1 2
1 3
3
2
2
输出样例1:
0
1
1
0
-1
输入样例2:
4
1 2
3
1 3
3
输出样例2:
0
0
1
1
思路
当时这题一直爆0到最后,为什么呢,因为我结果那又多加了一步c&1。之前做过一道类似的题,当时最后一步好像要c&1。我对于异或理解不太清楚,以为最后结果只有0或1,其实不是的
5^2=(101)^(010)=7
唉,还是基础不扎实,,多练、多练、多练。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5,INF=1e8;
int main(){
deque<int> d;
int q,flag=1;
cin>>q;
while(q--){
int op,x;
cin>>op;
if(op==1){
cin>>x;
if(flag==1) d.push_back(x);
else d.push_front(x);
}
else if(op==2){
if(d.size()){
if(flag==1) d.pop_front();
else d.pop_back();
}
}
else if(op==3) flag=flag*(-1);
if(d.size()==0) cout<<-1<<endl;
else{
int a,b;
a=d.front();
b=d.back();
int c=a^b;
cout<<c<<endl;
}
}
return 0;
}