zoukankan      html  css  js  c++  java
  • T83312 【音乐会】达拉崩吧·上

    T83312 【音乐会】达拉崩吧·上

    题解

    线段树板子题

    把原来的 + 变成 ^ 

    但是注意一下懒标记,这里讲一下小技巧

    代码

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int maxn=1e5+10;
    int n,m,x,y,v,opr;
    int a[maxn],add[maxn*4];
    long long sum[maxn*4];
    long long ans;
    
    inline int read()
    {
        int ans=0;
        char last=' ',ch=getchar();
        while(ch<'0'||ch>'9') last=ch,ch=getchar();
        while(ch>='0'&&ch<='9') ans=ans*10+ch-'0',ch=getchar();
        if(last=='-') ans=-ans;
        return ans;
    }
    
    void build(int k,int l,int r)
    {
        if(l==r)
        {
            sum[k]=a[l];  return ;
        } 
        int mid=(l+r)>>1;
        build(k<<1,l,mid);
        build(k<<1|1,mid+1,r);
        sum[k]=sum[k<<1]^sum[k<<1|1];
    }
    
    void Add(int k,int l,int r,int p)
    {
        add[k]^=p;
        sum[k]^=(long long)((r-l+1)%2)*p;   //注意这里的小技巧
    }
    
    void pushdown(int k,int l,int r,int mid)
    {
        if(add[k]==0) return ;
        Add(k<<1,l,mid,add[k]);
        Add(k<<1|1,mid+1,r,add[k]);
        add[k]=0;
    }
    
    void modify(int k,int l,int r,int x,int y,int v)
    {
        if(x<=l&&r<=y) return Add(k,l,r,v);
        int mid=(l+r)>>1;
        pushdown(k,l,r,mid);
        if(x<=mid) modify(k<<1,l,mid,x,y,v);
        if(mid<y) modify(k<<1|1,mid+1,r,x,y,v);
        sum[k]=sum[k<<1]^sum[k<<1|1];
    }
    
    long long query(int k,int l,int r,int x,int y)
    {
        if(x<=l&&r<=y) return sum[k];
        int mid=(l+r)>>1;
        long long res=0;
        pushdown(k,l,r,mid);
        if(x<=mid) res^=query(k<<1,l,mid,x,y);
        if(mid<y) res^=query(k<<1|1,mid+1,r,x,y);
        return res;
    }
    
    int main()
    {
        n=read();m=read();
        for(int i=1;i<=n;i++)
          a[i]=read();
        
        build(1,1,n);
        
        for(int i=1;i<=m;i++)
        {
            opr=read();x=read();y=read();
            if(opr==1)
            {
                v=read();
                modify(1,1,n,x,y,v);
            }
            if(opr==2)
            {
                ans=query(1,1,n,x,y);
                printf("%ld
    ",ans);
            }
        }
        
        return 0;
    }

    强烈安利 water-lift  QWQ

  • 相关阅读:
    面试题总结(vue面试题)
    面试题总结(css面试题)
    设置div居中显示
    关于js中iframe 中 location.href的用法
    js判断是否在iframe中
    npm git 常用命令行 记录
    mongDB数据库 小白学习
    EJS 入门学习
    bower 基础认识
    gulp 粗粗学习 记录下
  • 原文地址:https://www.cnblogs.com/xiaoyezi-wink/p/11106898.html
Copyright © 2011-2022 走看看