• 1080


    1080 - Binary Simulation
    Time Limit: 2 second(s) Memory Limit: 64 MB

    Given a binary number, we are about to do some operations on the number. Two types of operations can be here.

    'I i j'    which means invert the bit from i to j (inclusive)

    'Q i'    answer whether the ith bit is 0 or 1

    The MSB (most significant bit) is the first bit (i.e. i=1). The binary number can contain leading zeroes.

    Input

    Input starts with an integer T (≤ 10), denoting the number of test cases.

    Each case starts with a line containing a binary integer having length n (1 ≤ n ≤ 105). The next line will contain an integer q (1 ≤ q ≤ 50000) denoting the number of queries. Each query will be either in the form 'I i j' where i, j are integers and 1 ≤ i ≤ j ≤ n. Or the query will be in the form 'Q i' where i is an integer and 1 ≤ i ≤ n.

    Output

    For each case, print the case number in a single line. Then for each query 'Q i' you have to print 1 or 0 depending on the ith bit.

    Sample Input

    Output for Sample Input

    2

    0011001100

    6

    I 1 10

    I 2 7

    Q 2

    Q 1

    Q 7

    Q 5

    1011110111

    6

    I 1 10

    I 2 7

    Q 2

    Q 1

    Q 7

    Q 5

    Case 1:

    0

    1

    1

    0

    Case 2:

    0

    0

    0

    1

    Note

    Dataset is huge, use faster i/o methods.


    PROBLEM SETTER: JANE ALAM JAN
    思路:线段树;
    线段树维护加反了多少次。
     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<string.h>
     5 #include<queue>
     6 #include<math.h>
     7 using namespace std;
     8 char str[100005];
     9 int tree[4*100005];
    10 void in(int l,int r,int k,int nn,int mm)
    11 {
    12     if(l>mm||r<nn)
    13     {
    14         return ;
    15     }
    16     else if(l<=nn&&r>=mm)
    17     {
    18         tree[k]++;
    19         tree[k]%=2;
    20         return ;
    21     }
    22     else
    23     {
    24         tree[2*k+1]+=tree[k];
    25         tree[2*k+1]%=2;
    26         tree[2*k+2]+=tree[k];
    27         tree[2*k+2]%=2;
    28         tree[k] = 0;
    29         in(l,r,2*k+1,nn,(nn+mm)/2);
    30         in(l,r,2*k+2,(nn+mm)/2+1,mm);
    31     }
    32 }
    33 int ask(int l,int r,int k,int nn,int mm)
    34 {
    35     if(l>mm||r<nn)
    36     {
    37         return 0;
    38     }
    39     else if(l<=nn&&r>=mm)
    40     {
    41         return tree[k];
    42     }
    43     else
    44     {
    45         tree[2*k+1]+=tree[k];
    46         tree[2*k+1]%=2;
    47         tree[2*k+2]+=tree[k];
    48         tree[2*k+2]%=2;
    49         tree[k] = 0;
    50         int nx = ask(l,r,2*k+1,nn,(nn+mm)/2);
    51         int ny = ask(l,r,2*k+2,(nn+mm)/2+1,mm);
    52         return (nx + ny)%2;
    53     }
    54 }
    55 int main(void)
    56 {
    57     int T;
    58     scanf("%d",&T);
    59     int __ca = 0;
    60     while(T--)
    61     {
    62         __ca++;
    63         printf("Case %d:
    ",__ca);
    64         memset(tree,0,sizeof(tree));
    65         scanf("%s",str);
    66         int n;int l = strlen(str);
    67         scanf("%d ",&n);
    68         while(n--)
    69         {
    70             char a[10];
    71             int x,y;
    72             scanf("%s",a);
    73             if(a[0] == 'I')
    74             {scanf("%d %d",&x,&y);
    75              in(x-1,y-1,0,0,l-1);
    76             }
    77             else
    78             {
    79                 int x;
    80                 scanf("%d",&x);
    81                 int ny = ask(x-1,x-1,0,0,l-1);
    82                 printf("%d
    ",(str[x-1]-'0'+ny)%2);
    83             }
    84         }
    85     }return 0;
    86 }
    油!油!you@
  • 相关阅读:
    POJ 3211 Washing Clothes
    MySQL 优化Limit分页
    signed 与 unsigned 有符号和无符号数
    C/C++ 变量的初始化
    C/C++ 变量的初始化
    返回值的判断
    返回值的判断
    《涅槃经》的研读
    《涅槃经》的研读
    Opencv Surf算子特征提取与最优匹配
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5890936.html
Copyright © 2020-2023  润新知