HDU 6186 CS Course 前缀和,后缀和

Posted Lsxxxxxxxxxxxxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n", ans);
        }
    }
    return 0;
}

 

以上是关于HDU 6186 CS Course 前缀和,后缀和的主要内容,如果未能解决你的问题,请参考以下文章

HDU6186 2017广西邀请赛 CS Course (前缀和后缀)

HDU 6186 CS Course前后缀位运算枚举/线段树

HDU - 6186 前缀和位运算

hdu 6186

hdu 6186 水

HDU6186(线段树)