CSU 1258 异或运算的线段树
题目大意:
在给定区间内对每个数的最后一个二进制为1的位将其修改为0,如果数本身已经为0了,就不做改变
输出给定区间的所有数的异或值
#include <cstdio>
#include <cstring>
using namespace std;
#define N 10005
#define L ls,x,mid
#define R rs,mid+1,y
int sum[N<<],cnt[N<<],num[N]; void push_up(int o)
{
sum[o]=sum[o<<]^sum[o<<|];
cnt[o]=cnt[o<<]+cnt[o<<|];
} void build(int o,int x,int y)
{
int mid=(x+y)/,ls=o<<,rs=o<<|;
cnt[o]=;
if(x==y){
if(!num[x]) cnt[o]=;
sum[o]=num[x];
return;
}
build(L);
build(R);
push_up(o);
} void update(int o,int x,int y,int s,int t)
{
int mid=(x+y)/,ls=o<<,rs=o<<|;
if(cnt[o]==y-x+) return;
if(x==y){
sum[o]^=sum[o]&(-sum[o]);
if(sum[o]==) cnt[o]=;
return;
}
if(mid>=s) update(L,s,t);
if(mid<t) update(R,s,t);
push_up(o);
} int query(int o,int x,int y,int s,int t)
{
int mid=(x+y)/,ls=o<<,rs=o<<|;
if(cnt[o]==y-x+){
return ;
}
int ans=;
if(x>=s&&y<=t){
return sum[o];
}
if(mid>=s) ans^=query(L,s,t);
if(mid<t) ans^=query(R,s,t);
return ans;
} int main()
{
int n,m,a,b,c;
while(~scanf("%d%d",&n,&m)){
for(int i=;i<=n;i++)
scanf("%d",num+i); build(,,n); for(int i=;i<m;i++){
scanf("%d%d%d",&a,&b,&c);
if(a==) update(,,n,b,c);
else{
int ans=query(,,n,b,c);
printf("%d\n",ans);
}
}
}
return ;
}
CSU 1258 异或运算的线段树的更多相关文章
- ACM: FZU 2105 Digits Count - 位运算的线段树【黑科技福利】
FZU 2105 Digits Count Time Limit:10000MS Memory Limit:262144KB 64bit IO Format:%I64d & ...
- CSU - 1551 Longest Increasing Subsequence Again —— 线段树/树状数组 + 前缀和&后缀和
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1551 题意: 给出一段序列, 删除其中一段连续的子序列(或者不删), 使得剩下的序列 ...
- 线段相交的异或值 (线段树 or 优先队列)
VVQ 最近迷上了线段这种东西 现在他手上有 n 条线段,他希望在其中找到两条有公共点的线段,使得他们的异或值最大. 定义线段的异或值为它们并的长度减他们交的长度 输入描述: 第一行包括一个正整数 n ...
- 2018.10.18 bzoj4105: [Thu Summer Camp 2015]平方运算(线段树)
传送门 线段树妙题. 显然平方几次就会循环(打表证明不解释). 然后所有环长度的lcmlcmlcm不大于70. 因此维护一下当前区间中的节点是否全部在环上. 不是直接暴力到叶子节点修改. 否则整体打标 ...
- BZOJ4105 [Thu Summer Camp 2015]平方运算 【线段树】
题目链接 BZOJ4105 题解 平方操作orz,虽说应该是线段树,但是不会维护啊QAQ 小瞧一眼题解... 平方成环?环长\(lcm\)小于\(60\)? 果然还是打表找规律题.... 那就很好做了 ...
- BZOJ4105 THUSC2015平方运算(线段树)
注意到模数被给出且非常小,做法肯定要依赖于一些与此相关的性质.找题解打表可以发现循环节长度的lcm不超过60. 考虑怎么用线段树维护循环.对线段树上每个点维护这段区间的循环节.在循环中的位置,如果未进 ...
- CSU 1216异或最大值 (0-1 trie树)
Description 给定一些数,求这些数中两个数的异或值最大的那个值 Input 多组数据.第一行为数字个数n,1 <= n <= 10 ^ 5.接下来n行每行一个32位有符号非负整数 ...
- HDU 6186 CS Course【前后缀位运算枚举/线段树】
[前后缀枚举] #include<cstdio> #include<string> #include<cstdlib> #include<cmath> ...
- hdu 5068(线段树+矩阵乘法)
矩阵乘法来进行所有路径的运算, 线段树来查询修改. 关键还是矩阵乘法的结合律. Harry And Math Teacher Time Limit: 5000/3000 MS (Java/Others ...
随机推荐
- 题解报告:hdu 1062 Text Reverse
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1062 Problem Description Ignatius likes to write word ...
- Drawable(7)让一个没有pressed状态的控件使用StateList,显示pressed图片。
TextView没有按下状态,Button有. 如图1,内容1在一个TextView上,默认它并没有按下状态. 如何让TextView有呢. 在xml中加入属性: android:clickable= ...
- GC_CONCURRENT freed 循环不停打印日志
打印类似如下语句: 03-07 19:21:49.562: D/dalvikvm(1677): GC_CONCURRENT freed 2859K, 20% free 12020K/15011K, p ...
- C#模版学习研究
原文链接1 原文链接2 using System; using System.Collections.Generic; using System.Text; using T = System.By ...
- Codeforces Beta Round #98 (Div. 2)(A-E)
A #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> ...
- SP CAML工具
直接一直使用CAML做一些简单的SP列表查询,突然想对CAML进一步了解,于是找到两个常用工具,做以记录: 1 Caml Query Builder : 用于编写CAML查询,对初学者可以了解查询语句 ...
- Android 实现对多个EditText的监听
create_account=(EditText)findViewById(R.id.create_account); create_password=(EditText)findViewById(R ...
- 锐动SDK置于社区沙龙
北京锐动天地信息技术有限公司成立于2007年9月.多年来一直专注于音视频领域核心技术的研发, 拥有Windows.iOS.Android全平台自主知识产权的领先技术产品. 2011年获得新浪战略投资, ...
- qt 5中文乱码
头文件加上#prama execution_character_set("utf-8")
- Node.js——npm
npm un 包名 :删除指定包,不删除安装的依赖 npm un --save 包名: 删除包,并且删除其依赖项 npm install -g cnpm --registry=https://regi ...