• HDU 6186 CS Course 前缀和,后缀和


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6186

    题意:给了n个数,然后有q个查询,每个查询要求我们删掉一个数,问删掉这个数后整个序列的与值,或值,异或值的和。

    解法:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1e5+5;
    int n, m, a[maxn], sum1[maxn][2], sum2[maxn][2], sum3[maxn][2];
    
    int main()
    {
        while(~scanf("%d %d", &n,&m))
        {
            for(int i=1; i<=n; i++) scanf("%d", &a[i]);
            sum1[1][0] = sum2[1][0] = sum3[1][0] = a[1];
            for(int i=2; i<=n; i++){
                sum1[i][0] = sum1[i-1][0]&a[i];
                sum2[i][0] = sum2[i-1][0]|a[i];
                sum3[i][0] = sum3[i-1][0]^a[i];
            }
            sum1[n][1] = sum2[n][1] = sum3[n][1] = a[n];
            for(int i=n-1; i>=1; i--){
                sum1[i][1] = sum1[i+1][1]&a[i];
                sum2[i][1] = sum2[i+1][1]|a[i];
                sum3[i][1] = sum3[i+1][1]^a[i];
            }
            while(m--)
            {
                int idx;
                scanf("%d", &idx);
                int ans = INT_MAX;
                if(idx > 1) ans &= sum1[idx-1][0];
                if(idx < n) ans &= sum1[idx+1][1];
                printf("%d ", ans);
                ans = 0;
                if(idx > 1) ans |= sum2[idx-1][0];
                if(idx < n) ans |= sum2[idx+1][1];
                printf("%d ", ans);
                ans = 0;
                if(idx > 1) ans ^= sum3[idx-1][0];
                if(idx < n) ans ^= sum3[idx+1][1];
                printf("%d
    ", ans);
            }
        }
        return 0;
    }
    
  • 相关阅读:
    Spring学习之声明式事物管理
    SSH整合所需jar
    Spring学习之AOP
    常见MyEclipse报错—— serialVersionUID的作用
    Spring学习之基本概念
    Java基础——I/O续
    Java基础——I/O
    Vim学习总结
    Java基础——异常处理
    Git 学习总结
  • 原文地址:https://www.cnblogs.com/spfa/p/7485953.html
Copyright © 2020-2023  润新知