zoukankan      html  css  js  c++  java
  • codevs1690开关灯

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #define maxn 100010
    using namespace std;
    int n,m,num;
    struct node
    {
        int lc,rc;
        int l,r;
        int sum,bj;
    }t[maxn*2+100];
    void Build(int ll,int rr)
    {
        int k=++num;
        t[k].l=ll;t[k].r=rr;
        if(ll==rr)return;
        t[k].lc=num+1;
        Build(ll,(ll+rr)/2);
        t[k].rc=num+1;
        Build((ll+rr)/2+1,rr);
    }
    void update(int k)
    {
        t[t[k].lc].sum=abs(t[t[k].lc].r-t[t[k].lc].l+1-t[t[k].lc].sum);
        t[t[k].rc].sum=abs(t[t[k].rc].r-t[t[k].rc].l+1-t[t[k].rc].sum);
        t[t[k].lc].bj=!t[t[k].lc].bj;
        t[t[k].rc].bj=!t[t[k].rc].bj;
        t[k].bj=0;
    }
    void change(int k,int ll,int rr)
    {
        if(ll<=t[k].l&&rr>=t[k].r)
          {
              t[k].bj=!t[k].bj;
              t[k].sum=abs(t[k].r-t[k].l+1-t[k].sum);
              return;
          }
        if(t[k].bj)update(k);
        int mid=(t[k].l+t[k].r)/2;
        if(rr<=mid)change(t[k].lc,ll,rr);
        else if(ll>mid)change(t[k].rc,ll,rr);
        else
          {
              change(t[k].lc,ll,mid);
              change(t[k].rc,mid+1,rr);
          }
        t[k].sum=t[t[k].lc].sum+t[t[k].rc].sum;
    }
    int find(int k,int ll,int rr)
    {
        if(ll<=t[k].l&&rr>=t[k].r)return t[k].sum;
        if(t[k].bj)update(k);
        int ans=0;
        int mid=(t[k].l+t[k].r)/2;
        if(rr<=mid)ans+=find(t[k].lc,ll,rr);
        else if(ll>mid)ans+=find(t[k].rc,ll,rr);
        else ans+=find(t[k].lc,ll,mid)+find(t[k].rc,mid+1,rr);
        return ans;
    }
    int main()
    {
        scanf("%d",&n);
        Build(1,n);
        scanf("%d",&m);
        int x,y,z;
        for(int i=1;i<=m;i++)
          {
              scanf("%d",&x);
              if(x==0)
                {
                    scanf("%d%d",&y,&z);
                    change(1,y,z);
              }
            if(x==1)
                {
                    scanf("%d%d",&y,&z);
                    printf("%d
    ",find(1,y,z));
              }
          }
        return 0;
    }
  • 相关阅读:
    list和set的区别
    day13
    11期
    接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?
    Object类?
    swith的用法和注意事项?
    Ioc和DI的区别?
    多态的好处?
    抽象和接口的区别?
    内部类,匿名内部类?
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5469380.html
Copyright © 2011-2022 走看看