2019icpc南昌邀请赛F(线段树)
题目链接:https://nanti.jisuanke.com/t/40258
题意:给长为n的数组a,有m次操作,包括单点修改和查询F(l,r),其值为所有f(i,j)的异或和,l<=i<=j<=r,即

其中
(n,m<=1e5).
思路:这种题可以用线段树来进行修改和查询,但需要先化简。对于l<=x<=r,包括ax的区间有(r-x+1)*(x-l+1)个,注意到当区间长为偶数时,改值恒为偶数,那么也就是说ax出现偶数次,那么查询结果为0。当区间长度为奇数时,若x与l奇偶性不同,则该值为偶数,异或值为0; 若奇偶值相同,则该值为奇数,异或值为ax,故需要用线段树维护与l奇偶性相同的元素的异或和。
但是合并两个区间的时候,可能出现右区间的l与左区间的l奇偶性不同的情况,这时,右区间维护的值不能直接求与。需要同右区间整体异或和异或之后得到与左区间的l奇偶性相同的那些元素的异或和。说的很绕,手动算一下就明白,所以我们还需要用线段树维护区间的异或和。
AC代码:
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=; int T,n,m,cas,a[maxn]; struct node{
int l,r;
int sum,val;
}tr[maxn<<]; void pushup(int v){
tr[v].sum=tr[v<<].sum^tr[v<<|].sum;
if((tr[v<<|].l-tr[v].l)%==)
tr[v].val=tr[v<<].val^tr[v<<|].val;
else
tr[v].val=tr[v<<].val^(tr[v<<|].sum^tr[v<<|].val);
} void build(int v,int l,int r){
tr[v].l=l,tr[v].r=r;
if(l==r){
tr[v].sum=tr[v].val=a[l];
return;
}
int mid=(l+r)>>;
build(v<<,l,mid);
build(v<<|,mid+,r);
pushup(v);
} void update(int v,int x,int y){
if(tr[v].l==tr[v].r){
tr[v].sum=tr[v].val=y;
return;
}
int mid=(tr[v].l+tr[v].r)>>;
if(x<=mid) update(v<<,x,y);
else update(v<<|,x,y);
pushup(v);
} void query(int v,int l,int r,int& x,int& y){
if(tr[v].l==l&&tr[v].r==r){
x=tr[v].val;
y=tr[v].sum;
return;
}
int mid=(tr[v].l+tr[v].r)>>;
if(r<=mid)
query(v<<,l,r,x,y);
else if(l>mid)
query(v<<|,l,r,x,y);
else{
int a,b,c,d;
query(v<<,l,mid,a,b);
query(v<<|,mid+,r,c,d);
if((tr[v<<|].l-l)%==)
x=a^c,y=b^d;
else
x=a^(d^c),y=b^d;
}
} int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
scanf("%d",&a[i]);
build(,,n);
printf("Case #%d:\n",++cas);
while(m--){
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op==)
update(,x,y);
else{
if((y-x+)%==)
printf("0\n");
else{
int a,b;
query(,x,y,a,b);
printf("%d\n",a);
}
}
}
}
return ;
}
2019icpc南昌邀请赛F(线段树)的更多相关文章
- 2019ICPC南昌邀请赛网络赛 I. Max answer (单调栈+线段树/笛卡尔树)
题目链接 题意:求一个序列的最大的(区间最小值*区间和) 线段树做法:用单调栈求出每个数两边比它大的左右边界,然后用线段树求出每段区间的和sum.最小前缀lsum.最小后缀rsum,枚举每个数a[i] ...
- 计蒜客 38228. Max answer-线段树维护单调栈(The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer 南昌邀请赛网络赛) 2019ICPC南昌邀请赛网络赛
Max answer Alice has a magic array. She suggests that the value of a interval is equal to the sum of ...
- Codeforces Round #530 (Div. 2) F 线段树 + 树形dp(自下往上)
https://codeforces.com/contest/1099/problem/F 题意 一颗n个节点的树上,每个点都有\(x[i]\)个饼干,然后在i节点上吃一个饼干的时间是\(t[i]\) ...
- Please, another Queries on Array?(Codeforces Round #538 (Div. 2)F+线段树+欧拉函数+bitset)
题目链接 传送门 题面 思路 设\(x=\prod\limits_{i=l}^{r}a_i\)=\(\prod\limits_{i=1}^{n}p_i^{c_i}\) 由欧拉函数是积性函数得: \[ ...
- 2019ICPC南昌邀请赛 Sequence
题意:给出n个点的权值,m次操作,操作为1时为询问,每次询问给出 l 和 r ,求 f(l,r).操作为0时为修改权值.f(l,r)=f(l,l)⊕f(l,l+1)⊕⋯⊕f(l,r)⊕f(l+1,l+ ...
- 河南省多校联盟二-F 线段树+矩阵
---恢复内容开始--- 1284: SP教数学 时间限制: 2 秒 内存限制: 128 MB提交: 24 解决: 4 题目描述 输入 输出 对于每组数据的2操作,输出一行对1e9 + 7取模的答 ...
- 2019icpc南昌邀请赛B Polynomial (拉格朗日插值法)
题目链接:https://nanti.jisuanke.com/t/40254 题意: 思路: 这题要用到拉格朗日插值法,网上查了一下,找到一份讲得特别好的: -------------------- ...
- 线段树+单调栈+前缀和--2019icpc南昌网络赛I
线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...
- 南昌邀请赛I.Max answer 单调栈+线段树
题目链接:https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value of a in ...
随机推荐
- ON_WM_MOUSEWHEEL无响应
问题:ON_WM_MOUSEWHEEL消息无响应 转动滚轮会导致Windows在有输入焦点的窗口(不是鼠标光标下面的窗口)产生WM_MOUSEWHEEL消息.所以当子窗口没有焦点的时候将收不到消息WM ...
- Redis实战(18)Redis位图巧用,节约内存
序言 资料 https://www.cnblogs.com/luke44/p/12031078.html
- php大文件传输断点续传源码
1.使用PHP的创始人 Rasmus Lerdorf 写的APC扩展模块来实现(http://pecl.php.net/package/apc) APC实现方法: 安装APC,参照官方文档安装,可以使 ...
- 【BZOJ4671】 异或图
Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中, 否 ...
- 使用A* Pathfinding Project的一些心得
最近在游戏开发中要做寻路.首选果断就是Unity3D自带的寻路啦.方便稳定,基本功能都能满足.我们的需求也不复杂,就是一个英雄在不同的地图中探索.但是介于一个比较恶心的问题,果断放弃了它.所以,说A* ...
- BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=5330 (Luogu) https://www.luogu.org/prob ...
- linux端口释放
查看linux连接端口范围 cat /proc/sys/net/ipv4/ip_local_port_range 调低端口释放等待时间 echo 20 > /proc/sys/net/ipv4 ...
- 08.青蛙跳台阶 Java
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 思路 暴力枚举(自顶向下递归): 若台阶数小于等于0,返回0: 若台阶 ...
- 石川es6课程---9、面向对象-基础
石川es6课程---9.面向对象-基础 一.总结 一句话总结: js老版本的面向对象和继承都不是很方便,新版的面向对象向其它语言靠拢,有了class,extends,constructor等关键字,用 ...
- python:将numpy数组写入csv文件
import numpy as np np.savetxt('E:\\forpython\\featvector.csv',data_to_save,delimiter=',')