<span>2019ICPC南昌邀请赛 Sequence</span>

题意:给出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+1)f(l+1,r)f(r,r)F(l,r)=f(l,l)⊕f(l,l+1)⊕⋯⊕f(l,r)⊕f(l+1,l+1)⊕⋯f(l+1,r)⊕⋯⊕f(r,r)。

题解:首先多写算几个 l 到 r,可以发现当 r - l 时奇数的时候,f(l,r)为0;当 r - l 为偶数时,就是 l⊕l+2⊕⋯⊕r;区间异或可以用两个树状数组来完成,一个记录奇数位的前缀异或,一个记录偶数为的前缀异或。修改某个点权值时可以用式子a^b^b=a来更新权值。树状数组异或只要把+改成^就好了。

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define pb push_back()
 4 #define ft first
 5 #define sd second
 6 using namespace std;
 7 
 8 int a[100100],c[100100],d[100100],n,m;
 9 
10 int lowbit(int x)
11 {
12     return x&(-x);
13 }
14 
15 int sum(int x,int a[])        //区间查询
16 {
17     int s=0;
18     while(x>0)
19     {
20         s^=a[x];
21         x-=lowbit(x);
22     }
23     return s;
24 }
25 
26 void update(int x,int d,int a[])    //单点更新
27 {
28     while(x<=n)
29     {
30         a[x]^=d;
31         x+=lowbit(x);
32     }
33 }
34 
35 inline int read() {
36     char ch = getchar();
37     while (ch < '0' || ch > '9') ch = getchar();
38     int x = 0;
39     while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
40     return x;
41 }
42 
43 int main()
44 {
45     int t;
46     t=read();
47     int k=1;
48     while(t--){
49         memset(c,0,sizeof(c));
50         memset(d,0,sizeof(d));
51         cout<<"Case #"<<k++<<":  "<<endl;
52         n=read(),m=read();
53         for(int i=1;i<=n;i++) {
54             a[i]=read();
55             if(i&1) update(i/2+1,a[i],c);
56             else update(i/2,a[i],d);
57         }
58         while(m--){
59             int z,x,y;
60             z=read(),x=read(),y=read();
61             if(z==0){
62                 if(x&1) update(x/2+1,a[x]^y,c);
63                 else update(x/2,a[x]^y,d);
64                 a[x]=y;
65             }
66             else{
67                 if((y-x)&1) printf("0\n");
68                 else{
69                     int ans;
70                     if(x&1) ans=sum(x/2,c)^sum(y/2+1,c);
71                     else ans=sum(x/2-1,d)^sum(y/2,d);
72                     printf("%d\n",ans);
73                 }
74             }
75         }
76     }
77     return 0;
78 }

 

全部评论

相关推荐

会员标识
昨天 16:28
已编辑
牛客运营
从03年的“北大毕业生卖猪肉”到前段时间上热搜的“北大博士入职城管”,这些年“下沉式就业”现象频繁牵动着大家的视野和目光吧,很吸睛?我觉得并不是,如果你说985大学生XXX,那可能成不了焦点,如果说是北大清华毕业生去当城管,卖猪肉,大家都会讨论一番,无论是谁都知道北大清华的过人之处。但是呢近些年的确有很多985、211名校毕业生选择到基层就业或回老家创业,会不会觉得大财小用?老家的哥哥,因为当时学的专业不是很好,但好在学校不错,一路本硕连读,毕业之后在上海打拼了2年,也攒了一些小钱,随后回村选择科学养鸡,买了很大一块地开始科学方法的养鸡、卖鸡蛋,村里的老人都会议论纷纷,白瞎了家里供你读书,又回...
下午吃泡馍:不是每一个脱下长衫的人在下沉市场重获新生,并不是每一个养猪养鸡的高学历人才都会成功。现实是很多人的“长衫”就是自己为数不多甚至唯一的底牌了,拼尽全力拿到一个不错的学历,这时候主流媒体告诉对方脱下长衫也可以活的精彩,其实真的挺难过的。强者恒强,但是弱者是人群的底色。 本质上是整个市场的问题,没有足够多的增长点,没有足够多的岗位,自上而下没有积极向上的氛围。外企撤出,供应链缺失...在发展的过程中总有阵痛,现阶段可能就是我们承受阵痛的过程。之前在牛客看到一个小伙伴说:时代的一粒灰尘,落在谁的身上,都将是无法承受之重!深有感触。
点赞 评论 收藏
分享
浪子陪都:简历最优秀的地方放到了后面,国奖,校级奖学金这些是最亮眼的。说明你跟同级别的学生不一样。 建议台灯这个,PCB布局布线这个词汇不专业,业内是PCB Layout,第二,单片机的板子一般不用考虑SI,PI 都是低速信号,只要遵循3W原则就好了。 单片机的项目太low了,技能这块,你要看一下BOSS直聘的招聘要求,按照别人的要求写,一些关键词可以增加你简历被检索到的概率。 主修课程不用写,这个没有人去关注的。
点赞 评论 收藏
分享
起名字真难233:人家只有找猴子的预算,来个齐天大圣他们驾驭不住呀😂😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务