1. 程式人生 > >HDU 6186 CS Course 前綴和,後綴和

HDU 6186 CS Course 前綴和,後綴和

highlight log sum ans 一個 mes 要求 ace blog

題目鏈接: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 前綴和,後綴和