线段树模板二
2014-04-05 20:33
253 查看
//线段数模板二 数组模拟版 //功能:在自然数,且所有的数不大于30000的范围内讨论一个问题:现在已知n条线段,把端点 //依次输入告诉你,然后有m个询问,每个询问输入一个点,要求这个点在多少条线段上出现 #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; struct treel { int left,right; // 左端点 右端点 int cover; } t[1001]; int n,m; int sum=0; void build(int l,int r,int step) { t[step].left=l; t[step].right=r; t[step].cover=0; if(l==r) return; build(l,(l+r)/2,step*2); build((l+r)/2+1,r,step*2+1); } void dfs(int step) { cout<<t[step].cover<<endl; if(t[step].left==t[step].right) return; dfs(step*2); dfs(step*2+1); } void Insert(int c,int d,int step) { if(c==t[step].left&&d==t[step].right) { t[step].cover++; return; } if(t[step].left==t[step].right) return; int mid=(t[step].left+t[step].right)/2; if(mid>=d) Insert(c,d,step*2); else if(mid<c) Insert(c,d,step*2+1); else { Insert(c,mid,step*2); Insert(mid+1,d,step*2+1); } } void Find(int c,int d,int step) { if (t[step].cover!=0) sum=sum+t[step].cover*(d-c+1); if (t[step].left==t[step].right) return; int mid=(t[step].left+t[step].right)>>1; if (mid>=d) Find(c,d,step*2); else if(mid<c) Find(c,d,step*2+1); else { Find(c,mid,step*2); Find(mid+1,d,step*2+1); } } int main() { cin>>n>>m; build(0,n,1); int l,r; for(int i=0; i<m; i++) { cin>>l>>r; Insert(l,r,1); } Find(4,4,1); cout<<sum; return 0; }
相关文章推荐
- HDU - 1166 A - 敌兵布阵 线段树单点更新模板
- 线段树模板
- 线段树模板(区间和最大值最下值)
- 刘汝佳 线段树模板
- [模板]线段树的建树、查询、单点更新、区间更新
- POJ 3468(线段树模板 Lazy)
- HDU-1255-覆盖的面积-线段树求面积并(模板)
- hdu 1754 I Hate It【线段树入门+模板详解】
- HDU 1556 线段树 模板题
- Duan2baka的线段树模板!
- HDU1823-Luck and Love-二维线段树(模板)
- 线段树模板
- 线段树模板
- poj 3468 线段树区间更新(基础,模板)
- 简单线段树模板
- 【线段树成段更新-模板】【HDU1698】Just a Hook
- 线段树模板(区间最值)
- 【洛谷P3372】【模板】线段树1
- 线段树 扫描线求矩阵面积并的模板(zz)
- 【模板】线段树