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 ...
随机推荐
- bzoj 1059: [ZJOI2007]矩阵游戏【匈牙利算法】
注意到怎么换都行,但是如果把某个黑方块用在对角线上,它原来所在的行列的的黑方块就都不能用 所以要选出n组不重的行列组合,这里用匈牙利算法做二分图匹配即可(用了时间戳优化) #include<io ...
- bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡【dp+高斯消元】
算是比较经典的高斯消元应用了 设f[i]为i点答案,那么dp转移为f[u]=Σf[v]*(1-p/q)/d[v],意思是在u点爆炸可以从与u相连的v点转移过来 然后因为所有f都是未知数,高斯消元即可( ...
- bzoj 1657: [Usaco2006 Mar]Mooo 奶牛的歌声【单调栈】
先考虑只能往一边传播,最后正反两边就行 一向右传播为例,一头牛能听到的嚎叫是他左边的牛中与高度严格小于他并且和他之间没有更高的牛,用单调递减的栈维护即可 #include<iostream> ...
- printf的整型
参 数 说 明 %d 输出数字长为变量数值的实际长度 %md 输出m位(不足补空格,大于m位时按实际长度输出) %-md m含义同上.左对齐输出 %ld l(小写字母)表示输出“长整型”数据 %m1 ...
- MvcPager 分页控件
官方教程: http://www.webdiyer.com/mvcpager
- iOS规范化时间格式,object-C计算指定时间与当前的时间差
object-c计算指定时间与当前的时间差 头文件(.h): #import <Foundation/Foundation.h> @interface LuDate : NSDate +( ...
- bash 博弈
转载并修改自: http://www.cnblogs.com/wulangzhou/archive/2013/03/14/2959660.html 简单的取拿游戏一堆石子(或者其它的什么东西),下面是 ...
- 【C++】智能指针简述(五):解决循环引用的weak_ptr
总结一下前文内容: 1.智能指针通过RAII方法来管理指针:构造对象时,完成资源初始化;析构对象时,对资源进行清理及汕尾. 2.auto_ptr,通过“转移所有权”来防止析构一块内存多次.(如何转移? ...
- mysqlbinlog flashback 使用最佳实践
mysqlbinlog限制 该软件利用binlog中记录了操作前的数据镜像和操作后的数据镜像.有如下限制 1)binlog_format=row 2)必须打开binlog 3)只支持insert.up ...
- IntelliJ IDEA 2017安装和破解方法
一,安装 这里是windows下的安装,另外还有mac和linux下的版本,可自行解决 下载并安装IDEA官网:https://www.jetbrains.com/idea/ 或者百度网盘2017版本 ...