标签:clu else 查询 pac space ace pos 表示 style
字典树:字典树用来储存区域信息
主要有五种操作:
建树、单点查询、单点修改、区间查询、区间修改。
#include<bits/stdc++.h> using namespace std; struct node { int l,r,w;//l,r分别表示区间左右端点,w表示区间和 }tree[4*n+1];//字典树要开四倍空间 void build(int l,int r,int k) { tree[k].l=l;tree[k].r=r; if(l==r)//叶子节点 { scanf("%d",&tree[k].w); return ; } int m=(l+r)/2; build(l,m,k*2);//左孩子 build(m+1,r,k*2+1);//右孩子 tree[k].w=tree[k*2].w+tree[k*2+1].w;//状态合并,此结点的w=两个孩子的w之和 } int ask(int k,int pos) { if(tree[k].l==tree[k].r) //当前结点的左右端点相等,是叶子节点,是最终答案 { return tree[k].w; } int m=(tree[k].l+tree[k].r)/2; if(pos<=m) ask(k*2);//目标位置比中点靠左,就递归左孩子 else ask(k*2+1);//反之,递归右孩子 } void add(int k,int pos,int v) { if(tree[k].l==tree[k].r)//找到目标位置 { tree[k].w+=v; return; } int m=(tree[k].l+tree[k].r)/2; if(pos<=m) add(k*2); else add(k*2+1); tree[k].w=tree[k*2].w+tree[k*2+1].w;//所有包含结点k的结点状态更新 } void sum(int k,int left,int right) { if(tree[k].l>=left && tree[k].r<=right) { ans+=tree[k].w; return; } int m=(tree[k].l+tree[k].r)/2; if(left<=m) sum(k*2); if(right>m) sum(k*2+1); }
标签:clu else 查询 pac space ace pos 表示 style
原文地址:https://www.cnblogs.com/bxd123/p/10356042.html