tire树,树状数组,线段树模板

来源:互联网 发布:淘宝夜鹰黑搜 编辑:程序博客网 时间:2024/04/29 08:16

tire树 ,分为插入过程中的V用来保存权值 val[i]!=0表示这是个单词节点。


struct tire{      ch[100000][26];      val[100000];      int sz;      tire(){memset(ch,0,sizeof(ch));sz=1;}      int id(char c)      {          int sum=c-'a';          if(sum<0)sum+=32;          return sum;          }               void insert(string s,int v)      {           int n=s.length(),u=0;           for(int i=0;i<n;i++)           {                   int c=id(s[i]);                   if(!ch[u][c])                   ch[u][c]=sz++;                   u=ch[u][c];                   }           val[u]=v;              }            bool find()      {               int n=s.length(),u=0;           for(int i=0;i<n;i++)           {                   int c=id(s[i]);                   if(!ch[u][c])return 0;                   else                   u=ch[u][c];                   }           if(val[u])return 1 else return 0;      }          }tree;

树状数组


    int lowbit(int i){return i&(-i);}    void insert(int c,int s)    {          while(c<=n)          {                     a[c]+=s;                     c+=lowbit(c);                     }    }    int findsum(int c)    {                     int sum=0;                     while(c)                     {                             sum+=a[c];                             c-=lowbit(c);                          }                     return sum;    }


线段树


线段树练习一

支持的操作:   点修改&查询一段区间的和


#include<cstdio>#include<iostream>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;const int maxn=100005;int n,m;long long sum[maxn<<2];void pushup(int rt){     sum[rt]=sum[rt<<1]+sum[rt<<1|1];     }void build(int l,int r,int rt){     if(l==r)     {          scanf("%lld",&sum[rt]);            return;         }     int m=(l+r)>>1;     build(lson);     build(rson);     pushup(rt);     }void update(int p,int add,int l,int r,int rt){     if(l==r)     {         sum[rt]+=add;                 return;     }         int m=(l+r)>>1;     if(p<=m) update(p,add,lson);     else update(p,add,rson);     pushup(rt);}long long query(int L,int R,int l,int r,int rt){    if(L<=l&&r<=R)    {         return sum[rt];                  }    int m=(l+r)>>1;    long long ret=0;    if(L<=m)ret+=query(L,R,lson);    if(R>m)ret+=query(L,R,rson);    return ret;    }int main(){     scanf("%d",&n);     build(1,n,1);     scanf("%d",&m);     for(int i=1;i<=m;i++)     {          int x,y,z;          scanf("%d%d%d",&x,&y,&z);          if(x==1)          {                update(y,z,1,n,1);            }          else          {               printf("%lld\n",query(y,z,1,n,1));          }             }     return 0;}



原创粉丝点击