Light oj 1080 - Binary Simulation(树状数组区间更新点查询)

简介: 有一字符串只包含0和1,然后又m组操作,I L R是将从L到R的字符进行翻转操作0变为1、1变为0,Q x表示询问第x的字符。

题意:


   有一字符串只包含0和1,然后又m组操作,I L R是将从L到R的字符进行翻转操作0变为1、1变为0,Q x表示询问第x的字符。


思路:


   我们只需要计算对询问的字符进行了多少次翻转,如果是偶数次,该字符变,否则翻转。对于区间的更新,我们可以使用线段树,不过对于这个题,因为只是对点的查询,而且每个节点的初始值都相同,为0,因此我们可以直接使用树状数组。下面是一个很巧妙的做法,而且很容易理解。


用了树状数组的区间更新 单点查找(一般为单点更新 区间查找)


例如 区间(2,4)加1


则Updata(2,1)   Updata(4+1,-1)


实现了更新(2,4)的值而不改变其他值


求Sum时即可得到某一点的值

//LA 1080 - Binary Simulation
//2013-04-12-18.52
#include <stdio.h>
#include <string.h>
const int maxn = 100010;
char str[maxn];
int n;
int sum[maxn];
int lowbit(int x)
{
    return x&(-x);
}
void change(int x, int v)
{
    while (x <= n)
    {
        sum[x] += v;
        x += lowbit(x);
    }
}
int get(int x)
{
    int s = 0;
    while (x)
    {
        s += sum[x];
        x -= lowbit(x);
    }
    return s;
}
void update(int l, int r)
{
    change(l, 1);
    change(r+1, -1);
}
int main()
{
    int t, m;
    scanf("%d",&t);
    for(int i = 1; i <= t; i++)
    {
        memset(sum, 0, sizeof(sum));
        scanf("%s",&str[1]);
        scanf("%d",&m);
        n =strlen(&str[1]);
        char op;
        int l, r;
        printf("Case %d:\n",i);
        while (m--)
        {
            getchar();
            scanf("%c",&op);
            if (op == 'I')
            {
                scanf("%d %d",&l, &r);
                update(l, r);
            }
            else
            {
                scanf("%d",&l);
                if (get(l)%2 == 1)
                {
                    if (str[l] == '1')
                        puts("0");
                    else
                        puts("1");
                }
                else
                    printf("%c\n",str[l]);
            }
        }
    }
    return 0;
}
目录
相关文章
|
vr&ar
CF482B. Interesting Array(线段树)
CF482B. Interesting Array(线段树)
66 1
|
人工智能 BI
CF1169C. Increasing by Modulo(二分)
CF1169C. Increasing by Modulo(二分)
136 0
|
人工智能
Kuroni and Impossible Calculation——容斥原理-鸽笼原理-抽屉原理
题目描述 已知一个数组a[n],请计算式子:∏_{1≤i<j≤n}|ai−aj| 的值,其中1<=i,j<=n;我们可以认为,这一式子等价于 |a1−a2|⋅|a1−a3|⋅ … ⋅|a1−an|⋅|a2−a3|⋅|a2−a4|⋅ … ⋅|a2−an|⋅ … ⋅|an−1−an|
126 0
Kuroni and Impossible Calculation——容斥原理-鸽笼原理-抽屉原理
PAT (Advanced Level) Practice - 1068 Find More Coins(30 分)
PAT (Advanced Level) Practice - 1068 Find More Coins(30 分)
117 0
|
存储 算法
PAT (Advanced Level) Practice - 1151 LCA in a Binary Tree(30 分)
PAT (Advanced Level) Practice - 1151 LCA in a Binary Tree(30 分)
129 0
|
C++
蓝桥杯 - C++ calculation
蓝桥杯 - C++ calculation
166 0
|
Java C语言
HDOJ(HDU) 2139 Calculate the formula(水题,又一个用JavaAC不了的题目)
HDOJ(HDU) 2139 Calculate the formula(水题,又一个用JavaAC不了的题目)
102 0
|
算法
HDOJ 1202 The calculation of GPA
HDOJ 1202 The calculation of GPA
122 0
【1102】Invert a Binary Tree (25 分)
【1102】Invert a Binary Tree (25 分) 【1102】Invert a Binary Tree (25 分)
103 0