CSU 1258 异或运算的线段树

题目大意:
在给定区间内对每个数的最后一个二进制为1的位将其修改为0,如果数本身已经为0了,就不做改变

输出给定区间的所有数的异或值

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 #define N 10005
 5 #define L ls,x,mid
 6 #define R rs,mid+1,y
 7 int sum[N<<2],cnt[N<<2],num[N];
 8
 9 void push_up(int o)
10 {
11     sum[o]=sum[o<<1]^sum[o<<1|1];
12     cnt[o]=cnt[o<<1]+cnt[o<<1|1];
13 }
14
15 void build(int o,int x,int y)
16 {
17     int mid=(x+y)/2,ls=o<<1,rs=o<<1|1;
18     cnt[o]=0;
19     if(x==y){
20         if(!num[x]) cnt[o]=1;
21         sum[o]=num[x];
22         return;
23     }
24     build(L);
25     build(R);
26     push_up(o);
27 }
28
29 void update(int o,int x,int y,int s,int t)
30 {
31     int mid=(x+y)/2,ls=o<<1,rs=o<<1|1;
32     if(cnt[o]==y-x+1) return;
33     if(x==y){
34         sum[o]^=sum[o]&(-sum[o]);
35         if(sum[o]==0) cnt[o]=1;
36         return;
37     }
38     if(mid>=s) update(L,s,t);
39     if(mid<t) update(R,s,t);
40     push_up(o);
41 }
42
43 int query(int o,int x,int y,int s,int t)
44 {
45     int mid=(x+y)/2,ls=o<<1,rs=o<<1|1;
46     if(cnt[o]==y-x+1){
47         return 0;
48     }
49     int ans=0;
50     if(x>=s&&y<=t){
51         return sum[o];
52     }
53     if(mid>=s) ans^=query(L,s,t);
54     if(mid<t)  ans^=query(R,s,t);
55     return ans;
56 }
57
58 int main()
59 {
60     int n,m,a,b,c;
61     while(~scanf("%d%d",&n,&m)){
62         for(int i=1;i<=n;i++)
63             scanf("%d",num+i);
64
65         build(1,1,n);
66
67         for(int i=0;i<m;i++){
68             scanf("%d%d%d",&a,&b,&c);
69             if(a==1) update(1,1,n,b,c);
70             else{
71                 int ans=query(1,1,n,b,c);
72                 printf("%d\n",ans);
73             }
74         }
75     }
76     return 0;
77 }
时间: 2024-10-13 08:21:03

CSU 1258 异或运算的线段树的相关文章

ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】

FZU 2105  Digits Count Time Limit:10000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Practice 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 integer

CSU 1082: 憧憬一下集训 (线段树 扫描线)

连接 :  http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1082 题目可以将每个人的两种适应度转化为一个在坐标系里的矩形.假设音量为x轴,空调为y轴. 那么题目要求的可以转化为 在所有的矩形里选择一个点 这个点可以覆盖最多的矩形. 题目可以进一步转化 需要用到扫描线,只考虑每个矩形的上边和下边,每个边都构成一个扫描线(沿着y轴方向),对于每个扫描线只要统计在这个扫描线里被覆盖最多的点.答案就是2*n个扫描线中 的最大值. #include

csu 1110 RMQ with Shifts (线段树单点更新)

#include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <algorithm> #include <iostream> #include <cstdlib> #define lson l,m,rt<<1 #define rson m + 1,r ,rt<<1|1 using namespace s

HDU 6186 CS Course【前后缀位运算枚举/线段树】

[前后缀枚举] #include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream> #include<cstring> #include<set> #include<queue> #include<algorithm> #include<vector> #include<map

hdu 5068(线段树+矩阵乘法)

矩阵乘法来进行所有路径的运算, 线段树来查询修改. 关键还是矩阵乘法的结合律. Harry And Math Teacher Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 326    Accepted Submission(s): 89 Problem Description As we all know, Harry Porter

洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]

P2826 [USACO08NOV]光开关Light Switching 题目描述 Farmer John tries to keep the cows sharp by letting them play with intellectual toys. One of the larger toys is the lights in the barn. Each of the N (2 <= N <= 100,000) cow stalls conveniently numbered 1..N

Hdu4737 ( A Bit Fun ) 线段树

题意:统计最后有多少对[i,j]使得其区间内所有的值的或的值<m | 是非递减运算,线段树维护区间和 然后顺序统计下. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib

poj 3225 线段树+位运算

略复杂的一道题,首先要处理开闭区间问题,扩大两倍即可,注意输入最后要\n,初始化不能随便memset 采用线段树,对线段区间进行0,1标记表示该区间是否包含在s内U T S ← S ∪ T 即将[l,r]标记为1I T S ← S ∩ T 即将-oo~l和r~+oo标记为0,因为是并集,所以并集后的集合s一定在[l,r]内,则在l,r内的集合被标记是什么状态就是什么状态(表示是否属于s),[l,r]外的集合不属于s所以标记为0D T S ← S - T  即将[l,r]标记为0,则在[l,r]内

P5283 [十二省联考2019]异或粽子 可持久化01Trie+线段树

$ \color{#0066ff}{ 题目描述 }$ 小粽是一个喜欢吃粽子的好孩子.今天她在家里自己做起了粽子. 小粽面前有 \(n\) 种互不相同的粽子馅儿,小粽将它们摆放为了一排,并从左至右编号为 \(1\) 到 \(n\).第 \(i\) 种馅儿具有一个非负整数的属性值 \(a_i\).每种馅儿的数量都足够多,即小粽不会因为缺少原料而做不出想要的粽子.小粽准备用这些馅儿来做出 \(k\) 个粽子. 小粽的做法是:选两个整数数 \(l\), \(r\),满足 \(1 \leqslant l