二维线段树模式
1 #include<iostream> 2 using namespace std; 3 const int N=3000; 4 struct SubNode 5 { 6 int left,right; 7 int value; 8 } 9 struct Node 10 { 11 int left,right; 12 SubNode subnode[N]; 13 int value; 14 } 15 Node node[N]; 16 int left,right;//要使用区间的左右端点 17 void Sub_build(int l,int r,int i,int t)//头节点的i=0; 18 { 19 node[t].subnode[i].left=l; 20 node[t].subnode[i].right=r; 21 node[t].subnode[i].value=0; 22 if(l==r)return;//以点作为基本单位,每个叶子是一个点 23 //if(l+1==r)return//以边作为基本单位,每个叶子是一条长度为1的边 24 int mid=(l+r)>>1; 25 Sub_build(l,mid,2*i+1,t); 26 Sub_build(mid+1,r,2*i+2,t); 27 //Sub_build(mid, r,2*i+2,t); 28 } 29 void Main_build(int l,int r,int i)//i从零开始 30 { 31 node[i].left=l; 32 node[i].right=r; 33 node[i].value=0;//相应的值 34 Sub_build(left,right,0,i); 35 if(l==r)return; 36 if(l+1==r)return; 37 int mid=(l+r)>>1; 38 Main_build(l,mid,2*i+1); 39 Main_build(mid+1,r,2*i+2); 40 //Main_build(mid,r,2*i+2); 41 } 42 void query(int l,int r,int left,int right,int i) 43 { 44 //按照条件寻找相应的值 45 46 }
What I don't dare to say is I can't!