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

Posted roni-i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 6186 CS Course前后缀位运算枚举/线段树相关的知识,希望对你有一定的参考价值。

【前后缀枚举】

#include<cstdio>
#include<string>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<cstring>
#include<set>
#include<queue>
#include<algorithm>
#include<vector>
#include<map>
#include<cctype>
#include<stack>
#include<sstream>
#include<list>
#include<assert.h>
#include<bitset>
#include<numeric>
#define debug() puts("++++")
#define gcd(a,b) __gcd(a,b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define fi first
#define se second
#define pb push_back
#define sqr(x) ((x)*(x))
#define ms(a,b) memset(a,b,sizeof(a))
#define be begin()
#define pu push_up
#define pd push_down
#define cl clear()
#define lowbit(x) -x&x
#define all 1,n,1
#define mod 998244353

#define pi acos(-1.0)
#define rep(i,x,n) for(int i=(x); i<(n); i++)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> P;
const int INF = 1<<30;
const int maxn = 150000+3;
const double eps = 1e-8;
const int dx[] = {-1,1,0,0,1,1,-1,-1};
const int dy[] = {0,0,1,-1,1,-1,1,-1};
int dir[2]={-1,1};
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int t,n,m,d;
int a[maxn];
//& | ^
int px[maxn],py[maxn],pz[maxn];
int sx[maxn],sy[maxn],sz[maxn];
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        px[1]=py[1]=pz[1]=a[1];
        for(int i=2;i<=n;i++)
        {
            px[i]=px[i-1]&a[i];
            py[i]=py[i-1]|a[i];
            pz[i]=pz[i-1]^a[i];
        }
        sx[n]=sy[n]=sz[n]=a[n];
        for(int i=n-1;i>=1;i--)
        {
            sx[i]=sx[i+1]&a[i];
            sy[i]=sy[i+1]|a[i];
            sz[i]=sz[i+1]^a[i];
        }
        while(m--)
        {
            scanf("%d",&d);
            if(d==1)
                printf("%d %d %d
",sx[2],sy[2],sz[2]);
            else if(d==n)
                printf("%d %d %d
",px[n-1],py[n-1],pz[n-1]);
            else printf("%d %d %d
",px[d-1]&sx[d+1],py[d-1]|sy[d+1],pz[d-1]^sz[d+1]);
        }
    }
}
/*
【题意】去掉给你的一个数d后的其他数的&、|、^

【类型】前缀+后缀去掉枚举的那个数,注意边界

【分析】女生赛有道去掉一个数求剩下数的GCD(换汤不换药

【时间复杂度&&优化】O(n)

【trick】

【数据】
*/

以上是关于HDU 6186 CS Course前后缀位运算枚举/线段树的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6186 CS Course(前缀+后缀)

HDU 6186 CS Course 前缀和,后缀和

HDU - 6186 前缀和位运算

hdu 6186 水

hdu 6186

HDU6186(线段树)