zoukankan      html  css  js  c++  java
  • 其他一些数状数组的题

    APPLE TREE-POJ 3321

    树上树状数组,lef记录次节点的编号,rig记录他的字节点中编号最大的,则sum(rig)-sum(lef-1)即为

    所求值,此题会卡vector常数(我也不知道是什么东西)

    #include<iostream>
    #include<string.h> 
    #include<cmath>
    #include<vector>
    #define maxn 100000+10
    using namespace std;
    int n,m,lef[maxn],rig[maxn],sum[maxn],tot,s[maxn];
    vector<vector<int> > q(maxn);
    void add(int x,int d)
    {
        while(x<=n)
        {
            sum[x]+=d;
            x+=x&(-x);
        }
    }
    int susm(int x)
    {
        int ans=0;
        while(x)
        {
            ans+=sum[x];
            x-=x&(-x);
        }
        return ans;
    }
    void dfs(int x)
    {
        lef[x]=tot;
        for(int i=0;i<q[x].size();i++)
        {
            tot++;
            dfs(q[x][i]);
        }
        rig[x]=tot;
    }                    
    int main()
    {
        while(cin>>n)
        {
        memset(sum,0,sizeof(sum));
        memset(lef,0,sizeof(lef));
        memset(rig,0,sizeof(rig));
        memset(s,0,sizeof(s));
        for(int i=0;i<maxn;i++) q[i].clear();
       for(int i=1;i<=n-1;i++)
       {
        int x,y;
        cin>>x>>y;
        q[x].push_back(y);
       }
       tot=1;
       dfs(1);
       for(int i=1;i<=n;i++)
       {
           s[i]=1;
           add(i,1);
       }
       cin>>m;
       while(m--)
       {
             char s1[5];
             int x;
          scanf("%s%d",s1,&x);
          if(s1[0]=='Q')
          {
              //int x;
              //cin>>x;
              cout<<susm(rig[x])-susm(lef[x]-1)<<endl;
           } 
           else
           {
                 //int x;
                 //cin>>x;
                 if(s[x]) add(lef[x],-1);
                 else add(lef[x],1);
                 s[x]=!s[x];
                 
          }
       }
        }
       return 0;
    }

    Disharmony Trees   HDU - 3015

    树状数组加数据离散化,用三次排序解决即可

    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define maxn (int)1e5+5
    #include<cstring>
    typedef long long ll;
    int lowbit(int x)
    {
        return x&(-x);
    }
    ll n,c[maxn],c1[maxn];  //c tong ji he zhi c1 tong ji ge shu
    struct node
    {
        ll x,h;
    }tree[maxn];
    bool cmp(node a,node b)
    {
        return a.x<b.x;
    }
    bool cmp1(node a,node b)
    {
        return a.h<b.h;
    }
    void add(ll x,ll num,ll *s)
    {
        while(x<=n)
        {
            s[x]+=num;
            x+=lowbit(x);
        }
    }
    ll sum(ll x,ll *s)
    {
        ll ans=0;
        while(x)
        {
            ans+=s[x];
            x-=lowbit(x);
        }
        return ans;
    }
    int main()
    {
        while(cin>>n)
        {
            for(int i=1;i<=n;i++) cin>>tree[i].x>>tree[i].h;
            sort(tree+1,tree+1+n,cmp);
            int ji=tree[1].x;
            tree[1].x=1;
            for(int i=2;i<=n;i++)
            {
                if(tree[i].x==ji) tree[i].x=tree[i-1].x;
                else
                {
                    ji=tree[i].x;
                    tree[i].x=i;
                }
            }
            int jilu=tree[n].x;
            sort(tree+1,tree+1+n,cmp1);
            ji=tree[1].h;
            tree[1].h=1;
            for(int i=2;i<=n;i++)
            {
               if(tree[i].h==ji) tree[i].h=tree[i-1].h;
               else
               {
                   ji=tree[i].h;
                   tree[i].h=i;
               }    
            }
            sort(tree+1,tree+1+n,cmp1);
            memset(c,0,sizeof(c));
            memset(c1,0,sizeof(c1));
            for(int i=1;i<=n;i++)
            {
              add(tree[i].x,tree[i].x,c);
              add(tree[i].x,1,c1);    
            }
            int xiao,da;
            ll ans=0;
            for(int i=1;i<=n;i++)
            {
                xiao=sum(tree[i].x-1,c1)*tree[i].x-sum(tree[i].x-1,c);
                da=(sum(jilu,c)-sum(tree[i].x,c))-(sum(jilu,c1)-sum(tree[i].x,c1))*tree[i].x;
                ans+=tree[i].h*(xiao+da);
                add(tree[i].x,-tree[i].x,c);
                add(tree[i].x,-1,c1);
                
            }
            cout<<ans<<endl;    
        }    
        return 0;
    }                                                                                                                                                                                  
  • 相关阅读:
    Oracle笔记(三) Scott用户的表结构
    Oracle笔记(一) Oracle简介及安装
    Oracle笔记(七) 数据更新、事务处理、数据伪列
    Oracle笔记(六) 多表查询
    Oracle笔记(九) 表的创建及管理
    Oracle笔记(四) 简单查询、限定查询、数据的排序
    CentOS 6.3下部署LVS(NAT)+keepalived实现高性能高可用负载均衡
    PostgreSQL学习手册(十七) PL/pgSQL过程语言
    Oracle笔记(八) 复杂查询及总结
    Oracle笔记(十二) 集合、序列
  • 原文地址:https://www.cnblogs.com/tombraider-shadow/p/11157897.html
Copyright © 2011-2022 走看看