1 条题解
-
0
题目可以用一种典型的数据结构(线段树)来解决。
线段树的叶子节点会存储 (a_i) 的值。在距离叶子节点为 1 的节点处,我们会存储其两个叶子节点(即该节点的两个儿子)的 OR 值。同理,在距离叶子节点为 2 的节点处,我们会存储其两个直接儿子的 XOR 值。依此类推。这样,树的根节点就是所需的 (v) 值。
执行更新操作时,无需重建整棵树。要更新某个位置,只需找到从根节点到对应叶子节点的路径,并重新计算这条路径上的节点值即可。只要实现正确,每次更新的时间复杂度就是 (O(n))。同时,我们需要的空间复杂度为 (O(2^n))。
#include<stdio.h> //103 int n,m,v[18][1<<17];main(){scanf("%d%d",&n,&m);n=1<<n;for(int i=0;i<n;++i)scanf("%d",&v[0][i]);for(int i=1,w=1;i<18;++i,w<<=1)for(int j=0,*t=v[i-1];j<n;j+=w+w)v[i][j]=(i&1)?(t[j]|t[j+w]):(t[j]^t[j+w]);for(int i=0,p,b;i<m&&2==scanf("%d%d",&p,&b);++i){v[0][--p]=b;for(int i=1,w=1,*t;i<18;++i,w<<=1)p^=p&w,t=v[i-1],v[i][p]=(i&1)?(t[p]|t[p+w]):(t[p]^t[p+w]);printf("%d\n",v[17][0]);}}
- 1
信息
- ID
- 6759
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者