FZU 2105 (线段树)
Problem 2105 Digits Count
Problem Description
Given N integers A={A[0],A[1],...,A[N-1]}. Here we have some operations:
Operation 1: AND opn L R
Here opn, L and R are integers.
For L≤i≤R, we do A[i]=A[i] AND opn (here "AND" is bitwise operation).
Operation 2: OR opn L R
Here opn, L and R are integers.
For L≤i≤R, we do A[i]=A[i] OR opn (here "OR" is bitwise operation).
Operation 3: XOR opn L R
Here opn, L and R are integers.
For L≤i≤R, we do A[i]=A[i] XOR opn (here "XOR" is bitwise operation).
Operation 4: SUM L R
We want to know the result of A[L]+A[L+1]+...+A[R].
Now can you solve this easy problem?
Input
The first line of the input contains an integer T, indicating the number of test cases. (T≤100)
Then T cases, for any case, the first line has two integers n and m (1≤n≤1,000,000, 1≤m≤100,000), indicating the number of elements in A and the number of operations.
Then one line follows n integers A[0], A[1], ..., A[n-1] (0≤A[i]<16,0≤i<n).
Then m lines, each line must be one of the 4 operations above. (0≤opn≤15)
Output
Sample Input
Sample Output
题意不多说了。 观察下a的值表示成二进制不会超过4位内存刚刚够。对每一位维护一下线段树就好了。
具体维护方法如下:
由于 : 1 & 0 = 0
0 & 0 =0 所以&0会改变区间值。
1& 1 =1
0&1=0 所以&1 区间值不变,可以忽略。
同理可以分析其他的操作。然后线段树lazy维护一下1的个数就好了。 注意xor 和& or是互斥的,也就是说当标记了&或or时应把标记 xor清空。
1 // by cao ni ma
2 // hehe
3 #include <cstdio>
4 #include <cstring>
5 #include <algorithm>
6 #include <vector>
7 #include <queue>
8 using namespace std;
9 const int MAX = +;
10 typedef long long ll;
11 int sum[][MAX<<];
12 int col_or[][MAX<<],col_xor[][MAX<<];
13 int A[MAX];
14 void pushup(int o,int cur){
15 sum[cur][o]=sum[cur][o<<]+sum[cur][o<<|];
16 }
17
18 void pushdown(int o,int cur,int m){
19 if(col_or[cur][o]!=-){
20 col_xor[cur][o<<]=col_xor[cur][o<<|]=;
21 col_or[cur][o<<]=col_or[cur][o<<|]=col_or[cur][o];
22 sum[cur][o<<]=(m-(m>>))*col_or[cur][o<<];
23 sum[cur][o<<|]=(m>>)*col_or[cur][o<<|];
24 col_or[cur][o]=-;
25 }
26 if(col_xor[cur][o]){
27 col_xor[cur][o<<]^=,col_xor[cur][o<<|]^=;
28 sum[cur][o<<]=((m-(m>>))-sum[cur][o<<]);
29 sum[cur][o<<|]=((m>>)-sum[cur][o<<|]);
30 col_xor[cur][o]=;
31 }
32 }
33
34 void build(int L,int R,int o,int cur){
35 col_or[cur][o]=-;
36 col_xor[cur][o]=;
37 if(L==R){
38 sum[cur][o]=((A[L]&(<<cur))?:);
39 }
40 else{
41 int mid=(L+R)>>;
42 build(L,mid,o<<,cur);
43 build(mid+,R,o<<|,cur);
44 pushup(o,cur);
45 }
46 }
47
48 void modify2(int L,int R,int o,int ls,int rs,int v,int cur){
49 if(ls<=L && rs>=R){
50 col_xor[cur][o]=;
51 col_or[cur][o]=v;
52 sum[cur][o]=v*(R-L+);
53 return ;
54 }
55 pushdown(o,cur,R-L+);
56 int mid=(R+L)>>;
57 if(ls<=mid) modify2(L,mid,o<<,ls,rs,v,cur);
58 if(rs>mid) modify2(mid+,R,o<<|,ls,rs,v,cur);
59 pushup(o,cur);
60
61 }
62
63 void modify1(int L,int R,int o,int ls,int rs,int v,int cur){
64 if(ls<=L && rs>=R){
65 if(col_or[cur][o]!=-){
66 col_or[cur][o]^=;
67 sum[cur][o]=(R-L+)-sum[cur][o];
68 return ;
69 }
70 else{
71 col_xor[cur][o]^=;
72 sum[cur][o]=(R-L+)-sum[cur][o];
73 return ;
74 }
75 }
76 pushdown(o,cur,R-L+);
77 int mid=(R+L)>>;
78 if(ls<=mid) modify1(L,mid,o<<,ls,rs,v,cur);
79 if(rs>mid) modify1(mid+,R,o<<|,ls,rs,v,cur);
80 pushup(o,cur);
81 }
82
83 int Query(int L,int R,int o,int ls,int rs,int cur) {
84 if(ls<=L && rs>=R) return sum[cur][o];
85 pushdown(o,cur,R-L+);
86 int mid=(R+L)>>; int ans=;
87 if(ls<=mid) ans+=Query(L,mid,o<<,ls,rs,cur);
88 if(rs>mid) ans+=Query(mid+,R,o<<|,ls,rs,cur);
89 return ans;
90 }
91
92 int main(){
93 int n,m,cas,ls,rs,val;
94 char op[];
95 scanf("%d",&cas);
96 while(cas--){
97 scanf("%d %d",&n,&m);
98 for(int i=;i<=n;i++) {
99 scanf("%d",&A[i]);
}
for(int i=;i<;i++) {
build(,n,,i);
}
for(int i=;i<m;i++) {
scanf("%s",op);
if(op[]=='S'){
scanf("%d %d",&ls,&rs);
ls++,rs++;
int ans=;
for(int i=;i<;i++) {
ans+=Query(,n,,ls,rs,i)*(<<i);
}
printf("%d\n",ans);
}
else if(op[]=='O'){
scanf("%d %d %d",&val,&ls,&rs);
rs++,ls++;
for(int i=;i<;i++) {
if(val&(<<i)){
modify2(,n,,ls,rs,,i);
}
}
}
else if(op[]=='A'){
scanf("%d %d %d",&val,&ls,&rs);
rs++,ls++;
for(int i=;i<;i++) {
if(!(val&(<<i))){
modify2(,n,,ls,rs,,i);
}
}
}
else{
scanf("%d %d %d",&val,&ls,&rs);
rs++,ls++;
for(int i=;i<;i++) {
if((val&(<<i))){
modify1(,n,,ls,rs,,i);
}
}
}
}
}
return ;
145 }
FZU 2105 (线段树)的更多相关文章
- FZU 2171 线段树 区间更新求和
很模板的题 在建树的时候输入 求和后更新 #include<stdio.h> #include<string.h> #include<algorithm> #inc ...
- FZU 2171(线段树的延迟标记)
题意:容易理解. 分析:时隔很久,再一次写了一道线段树的代码,之前线段树的题也做了不少,包括各种延迟标记,但是在组队分任务之后,我们队的线段树就交给了另外一个队友在搞, 然后我就一直没去碰线段树的题了 ...
- HDU 3974 Assign the task(简单线段树)
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】
FZU 2105 Digits Count Time Limit:10000MS Memory Limit:262144KB 64bit IO Format:%I64d & ...
- FZU 2105 Digits Count(按位维护线段树)
[题目链接] http://acm.fzu.edu.cn/problem.php?pid=2105 [题目大意] 给出一个序列,数字均小于16,为正数,每次区间操作可以使得 1. [l,r]区间and ...
- FZU 2105 Digits Count(线段树)
Problem 2105 Digits Count Accept: 302 Submit: 1477 Time Limit: 10000 mSec Memory Limit : 262144 KB P ...
- F - Change FZU - 2277 (DFS序+线段树)
题目链接: F - Change FZU - 2277 题目大意: 题意: 给定一棵根为1, n个结点的树. 有q个操作,有两种不同的操作 (1) 1 v k x : a[v] += x, a[v ' ...
- FZu Problem 2236 第十四个目标 (线段树 + dp)
题目链接: FZu Problem 2236 第十四个目标 题目描述: 给出一个n个数的序列,问这个序列内严格递增序列有多少个?不要求连续 解题思路: 又遇到了用线段树来优化dp的题目,线段树节点里 ...
- fzu 2082 过路费 (树链剖分+线段树 边权)
Problem 2082 过路费 Accept: 887 Submit: 2881Time Limit: 1000 mSec Memory Limit : 32768 KB Proble ...
随机推荐
- 最常用的~正则表达式-相关js函数知识简洁分享【新手推荐】
一.正则表达式的创建 JS正则的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 varregObj =newRegExp("(^\s+)|(\s+ ...
- Linux学习之02_Linuxd的文件权限与目录配置
这里一些基本介绍就不介绍了,还是来介绍一下相关的命令 这一节重要的命令有这些: chgrp chown chmod 1.改变文件属性和权限 chgrp----改变文件所属用户组 chown----改变 ...
- JAVA POI的使用
最近开发遇到了要通过Java处理Excel文件的场景,于是乎在网上了解了一番,最后自己做了个demo,已上传gitee:https://gitee.com/github-26930945/JavaCo ...
- jQuery图片区域选择控件_imgAreaSelect
软考报名时发现可以进行头像区域裁剪功能,F12了一下,发现使用了imgAreaSelect控件. 控件官网: http://odyniec.net/projects/imgareaselect/ 控件 ...
- 转 PHP - AJAX 与 PHP
1. AJAX 被用于创建交互性更强的应用程序. AJAX PHP 实例 下面的实例将演示当用户在输入框中键入字符时,网页如何与 Web 服务器进行通信: 实例 尝试在输入框中输入一个名字,如:Ann ...
- apache-storm-0.9.6.tar.gz的集群搭建(3节点)(图文详解)
不多说,直接上干货! Storm的版本选取 我这里,是选用apache-storm-0.9.6.tar.gz Storm的本地模式安装 本地模式在一个进程里面模拟一个storm集群的所有功能, 这对开 ...
- T-SQL编程以及常用函数
1.索引添加索引,设计界面,在任何一列前右键--索引/键--点击进入添加某一列为索引 2.视图 视图就是我们查询出来的虚拟表创建视图:create view 视图名 as SQL查询语句,分组,排序, ...
- Hacker News的热门排名算法(转)
Hacker News 是一家关于计算机黑客和创业公司的社会化新闻网站,由 Paul Graham 的创业孵化器 Y Combinator 创建.与其它社会化新闻网站不同的是 Hacker News ...
- Django--知识补充
自定义标签或过滤器 渲染变量的方法(过滤器:修改数据或格式转换) {{ var | add }} {{ var | date:"Y-m" }} {{ var | safe }} 渲 ...
- Eclipse 编译java文件后出错 左树无红叉
问题描述: 今天遇见让人郁闷的问题,在项目工程中java文件编译通不过,eclipse在java文件中标示错误,但是却不不能在navigator的视图中像平常一样出现小红叉.通过clean proje ...