题目链接
HDU 6186
题目大意
给出n个数,在任意去掉一个数之后,求剩下所有数的与,或,异或
思路
思路一
前缀后缀和,先提前记录,之后一次性输出
思路二
用异或运算的性质
代码
#include <iostream>
#include <string.h>
#include <vector>
using namespace std
;
const int maxN
= 100005;
int pre1
[maxN
];
int pre2
[maxN
];
int pre3
[maxN
];
int suf1
[maxN
];
int suf2
[maxN
];
int suf3
[maxN
];
int a
[maxN
];
int n
,q
,x
;
int main()
{
while(cin
>>n
>>q
)
{
for(int i
=1; i
<=n
; ++i
)
{
scanf("%d",&a
[i
]);
}
pre1
[1] = pre2
[1] = pre3
[1] = a
[1];
for(int i
=2; i
<=n
; ++i
)
{
pre1
[i
] = pre1
[i
-1] & a
[i
];
pre2
[i
] = pre2
[i
-1] | a
[i
];
pre3
[i
] = pre3
[i
-1] ^ a
[i
];
}
suf1
[n
] = suf2
[n
] = suf3
[n
] = a
[n
];
for(int i
=n
-1; i
>=1; --i
)
{
suf1
[i
] = suf1
[i
+1] & a
[i
];
suf2
[i
] = suf2
[i
+1] | a
[i
];
suf3
[i
] = suf3
[i
+1] ^ a
[i
];
}
while(q
--)
{
scanf("%d",&x
);
if(x
==1)
{
cout
<< suf1
[x
+1] << " "
<< suf2
[x
+1] << " "
<< suf3
[x
+1] << endl
;
}
else if(x
==n
)
{
cout
<< pre1
[x
-1] << " "
<< pre2
[x
-1] << " "
<< pre3
[x
-1] << endl
;
}
else
{
printf("%d %d %d\n",(pre1
[x
-1] & suf1
[x
+1]),(pre2
[x
-1] | suf2
[x
+1]),(pre3
[x
-1] ^ suf3
[x
+1]));
}
}
}
return 0;
}
总结
TLE了好几次,才发现是cout的问题,以后还是用prinft叭
转载请注明原文地址: https://lol.8miu.com/read-13201.html