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 ...
随机推荐
- [App Store Connect帮助]六、测试 Beta 版本(3.1)管理测试员:添加内部测试员
您可以添加至多 25 个内部测试员(您的 App Store Connect 用户)使用“TestFlight Beta 版测试”来测试您的 App.在您上传了至少一个构建版本之后,才可添加测试员. ...
- [App Store Connect帮助]五、管理构建版本(2)查看构建版本和文件大小
您可以查看您为某个 App 上传的所有构建版本,和由 App Store 创建的变体版本的大小.一些构建版本在该 App 发布到 App Store 上后可能不会显示. 必要职能:“帐户持有人”职能. ...
- CF482C Game with Strings
题意 你和你的朋友玩一个游戏,游戏规则如下. 你的朋友创造 n 个长度均为 m 的不相同的字符串,然后他随机地选择其中一个.他选择这些字符串的概率是相等的,也就是说,他选择 n 个字符串中的每一个的概 ...
- 区间DP UVA 1351 String Compression
题目传送门 /* 题意:给一个字符串,连续相同的段落可以合并,gogogo->3(go),问最小表示的长度 区间DP:dp[i][j]表示[i,j]的区间最小表示长度,那么dp[i][j] = ...
- 二分搜索 Codeforces Round #218 (Div. 2) C. Hamburgers
题目传送门 /* 题意:一个汉堡制作由字符串得出,自己有一些原材料,还有钱可以去商店购买原材料,问最多能做几个汉堡 二分:二分汉堡个数,判断此时所花费的钱是否在规定以内 */ #include < ...
- Office Excel的几个快捷键记录
Office Excel的几个快捷键记录: 切换Sheet:CTRL + PageUP/PageDown 另存为:F12
- jquery 菜单展开与收缩参考脚本
/* * metismenu - v1.1.3 * Easy menu jQuery plugin for Twitter Bootstrap 3 * https://github.com/onoku ...
- [ Luogu 3927 ] Factorial
\(\\\) \(Description\) 求 \(N!\) 在 \(K\) 进制表示下末尾 \(0\) 的个数. \(N,K\in [1,10^{12}]\) \(\\\) \(Solution\ ...
- leetcode375 Guess Number Higher or Lower II
思路: dp. https://leetcode.com/problems/guess-number-higher-or-lower-ii/discuss/ 实现: class Solution { ...
- 添加telnet命令
打开控制面板,打开程序和功能,看到左边有个“打开或关闭Windows功能 ,打开找到telnet客户端,把这2项都勾选上,然后确定就可以了 注意,如果只要telnet别人的话,就选telnet客户端. ...