线段树模板二
来源:互联网 发布:看耳朵知健康 编辑:程序博客网 时间:2024/05/21 11:18
//线段数模板二 数组模拟版//功能:在自然数,且所有的数不大于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;}
0 0
- 线段树模板二
- nyoj 士兵杀敌(二) 116 (线段树模板)
- 士兵杀敌(二)(线段树模板)
- ACM 线段树模板(模板)
- 线段树模板
- hdu_1166_线段树模板
- 线段树模板
- 线段树模板 poj2777
- 线段树模板
- 线段树模板
- 线段树-模板
- 线段树模板
- 线段树模板
- 线段树模板
- Hdu1166-- 线段树模板
- 线段树模板
- 线段树模板
- 线段树模板
- 两个数交换算法(不需要临时变量)
- Shell script - How can I trim white space from a variable in awk?
- 浅谈设计原则OCP
- Shell script - awk内建变量示例详解之NR、FNR、NF
- dlut1223题解-打表
- 线段树模板二
- 数据库再设计(Database Redesign)
- Linux学习笔记 --服务器优化
- HighCharts中的无主题的2D折线图
- 矩阵的应用(持续更新中)
- Shell script - let命令
- 设计模式 --- 动态代理模式--demo2
- php实现mail函数的两种基本方法
- ngx 配置文件解析和初始化(http未执行之前)