1 条题解

  • 0
    @ 2026-5-3 20:05:41

    题目可以用一种典型的数据结构(线段树)来解决。

    线段树的叶子节点会存储 (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
    上传者