zoukankan      html  css  js  c++  java
  • 洛谷P5057 [CQOI2006]简单题题解

    [CQOI2006]简单题

    洛谷P5057 [CQOI2006]简单题

    看大家用的都是树状数组,赶紧来一发线段树。

    思路:简单线段树,只要把区间加改成区间xor即可。

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int t[400010];//如果t[i]不为叶子节点,t[i]为标记,否则t[i]为数值
    void down(int k)
    {
        if(t[k])
        {
            t[k<<1]^=1;
            t[k<<1|1]^=1;
            t[k]=0;
        }
    }
    void change(int k,int l,int r,int x,int y)
    {
        if(x<=l&&r<=y)//如果当前区间完全被修改区间包含,整体xor
        {
            t[k]^=1;
            return;
        }
        down(k);//下传标记
        int mid=(l+r)>>1;
        if(x<=mid)change(k<<1,l,mid,x,y);
        if(mid<y)change(k<<1|1,mid+1,r,x,y);
    }
    int ask(int k,int l,int r,int x)
    {
        if(l==r)return t[k];
        down(k);//下传标记
        int mid=(l+r)>>1;
        if(x<=mid)return ask(k<<1,l,mid,x);
        else return ask(k<<1|1,mid+1,r,x);
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int k,x,y;
            scanf("%d%d",&k,&x);
            if(k==1)
            {
                scanf("%d",&y);
                change(1,1,n,x,y);
            }
            else
                printf("%d
    ",ask(1,1,n,x));
        }
        return 0;
    }
    
  • 相关阅读:
    一条命令深度清理你的mac
    将以太坊封装为 ERC20
    golang subprocess tests
    go 笔记
    readme
    如何使用 channel
    修改vscode caipeiyu.writeCnblog ,简化博客发布
    thedao
    firefox 59 无法使用 pac 代理上网
    scrapy简单使用
  • 原文地址:https://www.cnblogs.com/hht2005/p/11378175.html
Copyright © 2011-2022 走看看