FZU 2105 (线段树)

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 ...
随机推荐
- Python基础 — OS
OS模块 -- 简介 OS模块是Python标准库中的一个用于访问操作系统功能的模块,OS模块提供了一种可移植的方法使用操作系统的功能.使用OS模块中提供的接口,可以实现跨平台访问.但是在OS模块 ...
- poj 2154 Color【polya定理+欧拉函数】
根据polya定理,答案应该是 \[ \frac{1}{n}\sum_{i=1}^{n}n^{gcd(i,n)} \] 但是这个显然不能直接求,因为n是1e9级别的,所以推一波式子: \[ \frac ...
- 400 Nth Digit 第N个数字
在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字.注意:n 是正数且在32为整形范围内 ( n < 231).示例 1:输入:3 ...
- 专题十一:实现一个基于FTP协议的程序——文件上传下载器
引言: 在这个专题将为大家揭开下FTP这个协议的面纱,其实学习知识和生活中的例子都是很相通的,就拿这个专题来说,要了解FTP协议然后根据FTP协议实现一个文件下载器,就和和追MM是差不多的过程的,相信 ...
- python中os模块中文帮助
python中os模块中文帮助 python中os模块中文帮助文档文章分类:Python编程 python中os模块中文帮助文档 翻译者:butalnd 翻译于2010.1.7——2010.1.8 ...
- Python之绘图和可视化
Python之绘图和可视化 1. 启用matplotlib 最常用的Pylab模式的IPython(IPython --pylab) 2. matplotlib的图像都位于Figure对象中. 可以使 ...
- Android屏幕尺寸与度量单位(px,dp,sp)简介
MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...
- canvas一周一练 -- canvas绘制立体文字(2)
运行效果: <!DOCTYPE html> <html> <head> </head> <body> <canvas id=" ...
- 模块挂载、切换,uml模式、流程图模式
模块挂载.切换,uml模式.流程图模式
- Linux的网卡由eth0变成了eth1或eth2,如何修复??
背景:做linux下分布式测试的时候,重新安装了两个linux虚拟机,结果分布式脚本没有做好,分布式也没有做成. 今天想练练linux命令,打开vmware,启动linux1 虚拟机,使用ifconf ...