题意: 给你一组序列,然后给你一个查询p,让你查询出这组序列除了a[p]之外的 |,&,^的值是多少?
思路: 区间除了p以外的话吗,我们可以维护一个前后缀就好了,然后每次p的时候 ,就让a[p-1] 和 a[p+1] 进行操作就好了,
(这么裸,我特么竟然还在找规律,,,真是菜)上代码吧:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define mes(a) memset(a,0,sizeof(a));
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int Or[maxn],And[maxn],Xor[maxn];
int rOr[maxn],rAnd[maxn],rXor[maxn];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
mes(a);
mes(Or);mes(Xor);mes(And);
mes(rOr);mes(rXor);mes(rAnd);
scanf("%d",&a[1]);
Or[1]=Xor[1]=And[1]=a[1];
for(int i = 2 ; i <= n;i++)
{
scanf("%d",&a[i]);
Or[i] = Or[i-1] | a[i];
Xor[i] = Xor[i-1] ^ a[i];
And[i] = And[i-1] & a[i];
}
rOr[n] = rAnd[n] = rXor[n] = a[n];
for(int i = n - 1 ; i>=1 ;i--)
{
rOr[i] = rOr[i+1]|a[i];
rXor[i] = rXor[i+1]^a[i];
rAnd[i] = rAnd[i+1]&a[i];
}
while(m--)
{
int p;
scanf("%d",&p);
if(p == 1)
{
printf("%d %d %d\n",rAnd[p+1],rOr[p+1],rXor[p+1]);
}
else if(p == n)
{
printf("%d %d %d\n",And[p-1],Or[p-1],Xor[p-1]);
}
else
{
printf("%d %d %d\n",And[p-1]&rAnd[p+1],Or[p-1]|rOr[p+1],Xor[p-1]^rXor[p+1]);
// printf("%d %d\n",Xor[p-1],rXor[p+1]);
}
}
}
return 0;
}