Fellow me on GitHub

HDU6186(线段树)

CS Course

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 112    Accepted Submission(s): 66


Problem Description

Little A has come to college and majored in Computer and Science.

Today he has learned bit-operations in Algorithm Lessons, and he got a problem as homework.

Here is the problem:

You are giving n non-negative integers a1,a2,,an, and some queries.

A query only contains a positive integer p, which means you 
are asked to answer the result of bit-operations (and, or, xor) of all the integers except ap.
 

 

Input

There are no more than 15 test cases. 

Each test case begins with two positive integers n and p
in a line, indicate the number of positive integers and the number of queries.

2n,q105

Then n non-negative integers a1,a2,,an follows in a line, 0ai109 for each i in range[1,n].

After that there are q positive integers p1,p2,,pqin q lines, 1pin for each i in range[1,q].
 

 

Output

For each query p, output three non-negative integers indicates the result of bit-operations(and, or, xor) of all non-negative integers except ap in a line.
 

 

Sample Input

3 3 1 1 1 1 2 3
 

 

Sample Output

1 1 0 1 1 0 1 1 0
 

 

Source

 
 1 //2017-08-31
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #define ll long long
 6 #define mid ((st[id].l+st[id].r)>>1)
 7 #define lson (id<<1)
 8 #define rson ((id<<1)|1)
 9 
10 using namespace std;
11 
12 const int N = 150000;
13 int arr[N];
14 struct Node{
15     int l, r, OR, XOR, AND;
16 }st[N<<3];
17 
18 void build(int id, int l, int r)
19 {
20     st[id].l = l; st[id].r = r;
21     if(l == r){
22         st[id].OR = arr[l];
23         st[id].AND = arr[l];
24         st[id].XOR = arr[l];
25         return;
26     }
27     build(lson, l, mid);
28     build(rson, mid+1, r);
29     st[id].OR = st[lson].OR | st[rson].OR;
30     st[id].XOR = st[lson].XOR ^ st[rson].XOR;
31     st[id].AND = st[lson].AND & st[rson].AND;
32 }
33 
34 int query(int id, int l, int r, int op){
35     if(st[id].l == l && st[id].r == r){
36         if(op == 1)return st[id].OR;
37         if(op == 2)return st[id].XOR;
38         if(op == 3)return st[id].AND;
39     }
40     if(l > mid)return query(rson, l, r, op);
41     else if(r <= mid)return query(lson, l, r, op);
42     else{
43         if(op == 1)return query(lson, l, mid, op) | query(rson, mid+1, r, op);
44         if(op == 2)return query(lson, l, mid, op) ^ query(rson, mid+1, r, op);
45         if(op == 3)return query(lson, l, mid, op) & query(rson, mid+1, r, op);
46     } 
47 }
48 
49 int main()
50 {
51     int n, q;
52     while(scanf("%d%d", &n, &q)!=EOF)
53     {
54         for(int i = 1; i <= n; i++)
55           scanf("%d", &arr[i]);
56         build(1, 1, n);
57         int p;
58         while(q--){
59             scanf("%d", &p);
60             if(p == 1)
61                   printf("%d %d %d\n", query(1, 2, n, 3), query(1, 2, n, 1), query(1, 2, n, 2));
62             else if(p == n)
63                   printf("%d %d %d\n", query(1, 1, n-1, 3), query(1, 1, n-1, 1), query(1, 1, n-1, 2));
64             else    
65                   printf("%d %d %d\n", query(1, 1, p-1, 3)&query(1, p+1, n, 3), query(1, 1, p-1, 1)|query(1, p+1, n, 1), query(1, 1, p-1, 2)^query(1, p+1, n, 2));
66         }
67     }
68 
69     return 0;
70 }

 

posted @ 2017-08-31 20:29  Penn000  阅读(242)  评论(0编辑  收藏  举报