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;
}
全部评论

相关推荐

11-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务