HDU 6186 CS Course
http://acm.hdu.edu.cn/showproblem.php?pid=6186
一开始自己做的时候一脸懵逼 然后在网上看了一下别人写的 又费了一番周折才A了这个题
意思是说 输入n个数 然后p次查询 每一次都输出除了第p个数以外 其他所有数的且运算,或运算,还有异或运算。思路也比较简单吧就是在一个数组里存前缀和 一个数组里存后缀和(前缀和也就是l[i]表示l[1]&l[2]&…l[i] 中间的符号也可以是|和^这里用&表示了 后缀和就是r[i]表示r[i]&r[i+1]&…r[n])这样预处理完了以后 算答案的时候直接l[p-1]&r[p+1]就可以了 还要注意p等于1和n的时候需要特殊处理。
恩。。。 这个题的数据规模应该是非常大的 在vjudge上用优化的cin和cout超时。在杭电可以过。最后还是换成了scanf。。以后看到这种规模的题还是不要太懒了 。。。乖乖的写scanf吧。
还有一个比较尴尬的事情是rand是个函数名….vjudge上的编译器不认这个当数组名 交上去CE了一发。
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 100010
int a[maxn];
int land[maxn],lor[maxn],lxor[maxn];
int r_and[maxn],ror[maxn],rxor[maxn];
int main()
{
int n,p;
while(scanf("%d%d",&n,&p)!=EOF)
{
for(int i = 1 ; i <= n ; i++)
{
scanf("%d",&a[i]);
}
land[1] = lor[1] = lxor[1] = a[1];
for(int i = 2 ; i <= n ; i++)
{
land[i]=a[i]&land[i-1];
lor[i]= a[i]|lor[i-1];
lxor[i]= a[i]^lxor[i-1];
}
r_and[n] = ror[n] = rxor[n] = a[n];
for(int i = n-1 ; i >= 1 ; i--)
{
r_and[i]=a[i]&r_and[i+1];
ror[i]= a[i]|ror[i+1];
rxor[i]= a[i]^rxor[i+1];
}
while(p--)
{
int q;
cin >> q;
if(q==1){printf("%d %d %d\n",r_and[2],ror[2],rxor[2]);continue;}
if(q==n){printf("%d %d %d\n",land[n-1],lor[n-1],lxor[n-1]);continue;}
printf("%d %d %d\n",(land[q-1]&r_and[q+1]),(lor[q-1]|ror[q+1]),(lxor[q-1]^rxor[q+1]));
}
}
return 0;
}