hdu 6186

题意:给出一个数列,q个询问,每个询问给出个下标,问除了该下标的数字,其他数字的and,or,xor是多少

思路:求个前缀,后缀即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=1e5+10;
 5
 6 int a[N],b[N],c[N];
 7 int a1[N],b1[N],c1[N];
 8 int d[N];
 9
10 int main(){
11     int n,m;
12    while(scanf("%d%d",&n,&m)!=EOF){
13        // a[0]=b[0]=c[0]=0;
14       //  a1[n+1]=b1[n+1]=c1[n+1]=0;
15         for(int i=1;i<=n;i++){
16             scanf("%d",&d[i]);
17             if(i==1) {
18                 a[i]=b[i]=c[i]=d[i];continue;
19             }
20             a[i]=d[i]&a[i-1];
21             b[i]=d[i]|b[i-1];
22             c[i]=d[i]^c[i-1];
23         }
24         for(int i=n;i>=1;i--){
25              if(i==n) {
26                 a1[i]=b1[i]=c1[i]=d[i];continue;
27             }
28             a1[i]=d[i]&a1[i+1];
29             b1[i]=d[i]|b1[i+1];
30             c1[i]=d[i]^c1[i+1];
31         }
32         int x;
33         for(int i=1;i<=m;i++){
34             scanf("%d",&x);
35             if(x==1){
36                 printf("%d %d %d\n",a1[x+1],b1[x+1],c1[x+1]);continue;
37             }
38             if(x==n){
39                 printf("%d %d %d\n",a[x-1],b[x-1],c[x-1]);continue;
40             }
41             printf("%d ",a[x-1]&a1[x+1]);
42             printf("%d ",b[x-1]|b1[x+1]);
43             printf("%d",c[x-1]^c1[x+1]);
44             printf("\n");
45         }
46
47    }
48 }
时间: 2024-10-10 09:35:26

hdu 6186的相关文章

hdu 6186 水

hdu 6186   CS Course 求个前后缀就好了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b)

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

HDU 6186 CS Course(前缀+后缀)

http://acm.hdu.edu.cn/showproblem.php?pid=6186 题意:给出n个数,共有n次询问,每次询问给出一个数p,求除去第p个数后的n-1个数的&.|.^值. 思路:分别计算出&.|.^的前缀和后缀,将前缀和后缀相计算即可. 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 const int ma

HDU - 6186 前缀和位运算

异或操作蒙蔽了我的双眼 以至于没有第一时间想到前缀和与后缀和 水题做的不够多 #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) #define rrep(i,j,k) for(register int i=j;i>=k;i--) using namespace std; typedef long long ll; const int maxn = 1e5+11; ll xxor[max

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

一周水题集锦 2017 8.28

CF Round 431 A. Odds and Ends 解题思路:长度为奇数,开头奇数,结尾奇数. CS Academy Round 44 Frequent Numbers 解题思路:需要吗??? CS Academy Round 44 Square Cover 解题思路:对于每个点,如果未访问并且该数字未出现过就向右向下延伸,之后是否包围了正方形以及其中数字是否全部相等.标记该点以及该数字.出现未访问过的点但是数字访问过也不满足. HDU 6182 A Math Problem 解题思路:

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往