zoukankan      html  css  js  c++  java
  • UESTC--1730

    原题链接:http://acm.uestc.edu.cn/problem.php?pid=1730

    分析:线段树单点更新,区间求和。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #define maxn 500005
     7 #define mod 1000007
     8 using namespace std;
     9 int sum[maxn<<2];
    10 int x[maxn];
    11 void build(int l,int r,int rt)
    12 {
    13     if(l==r)
    14     {
    15         sum[rt]=x[l];
    16         return;
    17     }
    18     int m=(l+r)>>1;
    19     build(l,m,rt<<1);
    20     build(m+1,r,rt<<1|1);
    21     sum[rt]=sum[rt<<1]^sum[rt<<1|1];
    22 }
    23 void update(int l,int r,int rt,int ii,int v)
    24 {
    25     if(l==r&&l==ii){
    26         sum[rt]=v;
    27         return;
    28     }
    29     int m=(l+r)>>1;
    30     if(ii<=m)update(l,m,rt<<1,ii,v);
    31     else update(m+1,r,rt<<1|1,ii,v);
    32     sum[rt]=sum[rt<<1]^sum[rt<<1|1];
    33 }
    34 int get_sum(int L,int R,int l,int r,int rt)
    35 {
    36     if(L<=l&&r<=R)return sum[rt];
    37     int m=(l+r)>>1;
    38     int res=0;
    39     if(L<=m)res^=get_sum(L,R,l,m,rt<<1);
    40     if(R>=m+1)res^=get_sum(L,R,m+1,r,rt<<1|1);
    41     return res;
    42 }
    43 int main()
    44 {
    45      int n,m;
    46      cin>>n>>m;
    47      for(int i=1;i<=n;i++)
    48      scanf("%d",&x[i]);
    49      build(1,n,1);
    50      int i,j;char op[2];
    51      while(m--)
    52      {
    53          scanf("%s %d %d",op,&i,&j);
    54          if(op[0]=='Q')
    55          {
    56              printf("%d
    ",get_sum(i,j,1,n,1));
    57          }
    58          else update(1,n,1,i,j);
    59      }
    60     return 0;
    61 }
    View Code
  • 相关阅读:
    面试题6 重建二叉树
    面试题5 从尾到头打印链表
    面试题4 替换空格
    面试题3 二维数组中查找
    面试题2 单例
    C++ 强制类型转换
    C++ 11 新特性
    STL 函数对象
    STL 算法
    OpenSSH多路复用Multiplexing配置
  • 原文地址:https://www.cnblogs.com/i-love-acm/p/3293198.html
Copyright © 2011-2022 走看看