题目链接:http://www.lightoj.com/volume_showproblem.php?problem=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

题目大意:给你一段二进制数,当输入为 I  x  y时。就把这段变成它的反串 。当为Q 就查询当前x这个位置的数字视为0还是1。

思路:此题有两种解题的思路,一种是线段树。一种是树状数组。当用树状数组时。能够看成是一个区间改动,单点查询的问题,当我们用线段树时。那么就须要用到懒惰标记。

对于这道题树状数组确实比线段是快非常多。

。。。

线段树代码:

//time 584 ms

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#define L(u) u<<1
#define R(u) u<<1|1 using namespace std; const int Max=100010;
char str[Max];
class Node
{
public:
int l,r;
char str;
int add;
}node[Max*4]; void build(int l,int r,int u)
{
node[u].l=l;
node[u].r=r;
node[u].add=0;
if(l==r)
{
node[u].str=str[l];
return;
}
int mid=(l+r)/2;
build(l,mid,L(u));
build(mid+1,r,R(u));
} void pushdown(int u) //注意这儿要懒惰标记
{
node[L(u)].add+=node[u].add; //主义要加上。。。 。 。
node[R(u)].add+=node[u].add;
node[u].add=0;
} void update(int l,int r,int u)
{
if(l<=node[u].l&&node[u].r<=r)
{
node[u].add++;
return ;
}
if(node[u].add) pushdown(u);
int mid=(node[u].l+node[u].r)/2;
if(r<=mid)
{
update(l,r,L(u));
}
else if(l>mid)
{
update(l,r,R(u));
}
else
{
update(l,mid,L(u));
update(mid+1,r,R(u));
}
return ;
} char query(int l,int r,int u)
{
if(l<=node[u].l&&node[u].r<=r)
{
if((node[u].add%2)==1)
{
node[u].add=0;
if(node[u].str=='1')
{
node[u].str='0';
return node[u].str;
}
else
{
node[u].str='1';
return node[u].str;
}
}
else
{
node[u].add=0;
return node[u].str;
}
}
if(node[u].add) pushdown(u);
int mid=(node[u].l+node[u].r)/2;
if(r<=mid)
{
return query(l,r,L(u));
}
else if(l>mid)
{
return query(l,r,R(u));
}
} int main()
{
int T,q,i,j,kk=0;;
scanf("%d",&T);
while(T--)
{
getchar();
kk++;
str[0]='3';
scanf("%s",str+1);
int len=strlen(str);
build(1,len-1,1);
scanf("%d",&q);
char ch[5];
printf("Case %d:\n",kk);
for(i=0;i<q;i++)
{
scanf("%s",ch);
if(ch[0]=='I')
{
int x,y;
scanf("%d%d",&x,&y);
update(x,y,1);
}
else
{
int x;
scanf("%d",&x);
printf("%c\n",query(x,x,1));
}
}
}
return 0;
}

树状数组代码:

//time 304 ms
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream> using namespace std; const int Max=100010; int a[Max];
int n; int lowbit(int x)
{
return x&(-x);
} void insert(int x,int d)
{
while(x<=n)
{
a[x]+=d;
x+=lowbit(x);
}
} int query(int x)
{
int res=0;
while(x>0)
{
res+=a[x];
x-=lowbit(x);
}
return res;
} int main()
{
char str[Max],ch[5];
int T,q,kk=0;
scanf("%d",&T);
while(T--)
{
kk++;
memset(a,0,sizeof(a));
str[0]='2';
scanf("%s",str+1);
n=strlen(str)-1;
scanf("%d",&q);
printf("Case %d:\n",kk);
for(int i=0;i<q;i++)
{
scanf("%s",ch);
if(ch[0]=='I')
{
int x,y;
scanf("%d%d",&x,&y);
insert(x,1);
insert(y+1,-1);
}
else
{
int x;
scanf("%d",&x);
int t=query(x);
if(t%2==1)
{
if(str[x]=='1')
{
printf("0\n");
}
else
{
printf("1\n");
}
}
else
{
printf("%c\n",str[x]);
}
}
} }
return 0;
}

Light OJ 1080 - Binary Simulation的更多相关文章

  1. 1080 - Binary Simulation

    1080 - Binary Simulation    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 64 ...

  2. Light OJ 1114 Easily Readable 字典树

    题目来源:Light OJ 1114 Easily Readable 题意:求一个句子有多少种组成方案 仅仅要满足每一个单词的首尾字符一样 中间顺序能够变化 思路:每一个单词除了首尾 中间的字符排序 ...

  3. Light OJ 1429 Assassin`s Creed (II) BFS+缩点+最小路径覆盖

    题目来源:Light OJ 1429 Assassin`s Creed (II) 题意:最少几个人走全然图 能够反复走 有向图 思路:假设是DAG图而且每一个点不能反复走 那么就是裸的最小路径覆盖 如 ...

  4. Light OJ 1406 Assassin`s Creed 减少国家DP+支撑点甚至通缩+最小路径覆盖

    标题来源:problem=1406">Light OJ 1406 Assassin`s Creed 意甲冠军:向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路: ...

  5. Light OJ 1316 A Wedding Party 最短路+状态压缩DP

    题目来源:Light OJ 1316 1316 - A Wedding Party 题意:和HDU 4284 差点儿相同 有一些商店 从起点到终点在走过尽量多商店的情况下求最短路 思路:首先预处理每两 ...

  6. light oj 1007 Mathematically Hard (欧拉函数)

    题目地址:light oj 1007 第一发欧拉函数. 欧拉函数重要性质: 设a为N的质因数.若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N ...

  7. Light OJ 1406 Assassin`s Creed 状态压缩DP+强连通缩点+最小路径覆盖

    题目来源:Light OJ 1406 Assassin`s Creed 题意:有向图 派出最少的人经过全部的城市 而且每一个人不能走别人走过的地方 思路:最少的的人能够走全然图 明显是最小路径覆盖问题 ...

  8. Light OJ 1288 Subsets Forming Perfect Squares 高斯消元求矩阵的秩

    题目来源:Light OJ 1288 Subsets Forming Perfect Squares 题意:给你n个数 选出一些数 他们的乘积是全然平方数 求有多少种方案 思路:每一个数分解因子 每隔 ...

  9. Jan's light oj 01--二分搜索篇

    碰到的一般题型:1.准确值二分查找,或者三分查找(类似二次函数的模型). 2.与计算几何相结合答案精度要求比较高的二分查找,有时与圆有关系时需要用到反三角函数利用 角度解题. 3.不好直接求解的一类计 ...

随机推荐

  1. HDU 5358 First One(枚举)

    First One Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

  2. hdu 2079 选课时间(题目已改动,注意读题) (母函数)

    代码: #include<cstdio> #include<cstring> using namespace std; int main() { int t; scanf(&q ...

  3. 相辅相成的求最单源短路径算法:(SPFA& dijkstra)

    引用一位老oier的话: 一道题如果边权没有负数,那么一定是在卡SPFA.这时候就用到了堆优化的Dijkstra; 写在前面: 多打代码! 最好都掌握,灵活变通 SPFA: 主要用于稀疏图和有负权边的 ...

  4. Linux命令locate

    centos安装locate命令 centos6.3刚初始化安装完毕,有个配置文件不知道存在什么地方,想用locate命令来查找下,发现系统提示,找不到该命令.以前经常用的命令为什么找不到了呢???原 ...

  5. Creative Cloud 安装出错,错误代码:207

    C:\Users\xxx\AppData\Local\Temp\CreativeCloud\ACC\AdobeDownload %Temp%\CreativeCloud\ACC\AdobeDownlo ...

  6. 你不知道的JavaScript(十)with关键字

    with关键字在JavaScript中不太常用,用来定义一个和对象相关的作用域,在该作用域中可以访问对象的属性或方法而前面无需加上对象名,以达到简化代码的目的. <script type=&qu ...

  7. sql server2008怎么给一张表加一个用户

    有时候我们要对数据库进行权限管理,防止有人误操作或者窃取数据,那么小编这篇文章就是实现这个的操作过程. 百度经验:jingyan.baidu.com 工具/原料   sql server2008数据库 ...

  8. hiho1509 异或排序

    题目链接 题目大意: 给定一个长度为 n 的非负整数序列 a[1..n] 你需要求有多少个非负整数 S 满足以下两个条件: (1).0 ≤ S < 260 (2).对于所有 1 ≤ i < ...

  9. 《Unix环境高级编程》读书笔记 第11章-线程

    1. 引言 了解如何使用多个控制线程在单进程环境中执行多个任务. 不管在什么情况下,只要单个资源需要在多个用户键共享,就必须处理一致性问题. 2. 线程概念 典型的Unix进程可以看成只有一个控制线程 ...

  10. Dapper基础知识三

    在下刚毕业工作,之前实习有用到Dapper?这几天新项目想用上Dapper,在下比较菜鸟,这块只是个人对Dapper的一种总结. Dapper,当项目在开发的时候,在没有必要使用依赖注入的时候,如何做 ...