(位运算)(前缀和)CS Course

it2024-01-10  56

题目链接

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) { //cin>>a[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--) { // cin>>x; 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,否则会TLE 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叭

最新回复(0)