题目链接:http://acm.swust.edu.cn/problem/746/

Time limit(ms): 1000      Memory limit(kb): 65535
 

fate是一个数学大牛,热衷于各种数学问题.一次toshio,lo和fate玩了一个很简单的游戏.

在一条长40000的数轴上toshio说了M条线段的位置,每条线段给了头和尾的坐标,每条线的坐标都小于等于40000.

由lo发起N个提问,提问任意说一个点的坐标,要fate说出这个点在多少条线段上.

Description

两个整数M和N(0 < N,M <= 40000)

以下M行,每行两个整数b[i],e[i](0 <= b[i] < e[i] <= 40000)表示第i条线段的两个坐标.(注:点b[i]在线段上,但e[i]不在线段上.)

接下来N行,每行一个整数,表示lo询问的点的坐标.

Input

N行输出

对于lo询问的N个点,每个点分别在几条线段上.

Output
1
2
3
4
5
6
7
8
9
4 3
1 5
2 6
3 7
4 8
2
5
9
 
Sample Input
1
2
3
4
2
3
0
 
Sample Output
 
 
这道题可以说是经典的线段树的题目(关于线段树的用法可以看看这里:http://www.cnblogs.com/zyxStar/p/4562917.html
 
直接上线段树的代码
 
 /************************线段树******************************/

 #include <iostream>
#include <cstring>
using namespace std;
const int maxn = ;
#define rep(i,a,b) for(int i=a;i<b;i++) struct node{
int left, right, mid, val;
}interval[maxn << ]; int n, m, x, y; //线段树的构建
void build(int left, int right, int k){
interval[k].left = left;
interval[k].right = right;
interval[k].mid = (left + right) / ;
interval[k].val = ;
if (left == right)
return;
build(left, interval[k].mid, * k);
build(interval[k].mid + , right, * k + );
} //插入操作寻找[left,right]更新数据
void insert(int left, int right, int k){
if (interval[k].left == left && interval[k].right == right){
interval[k].val++;
return;
}
if (right <= interval[k].mid)
insert(left, right, * k);
else if (left > interval[k].mid)
insert(left, right, * k + );
else{
//覆盖重合拆分成两个区间更新数据
insert(left, interval[k].mid, * k);
insert(interval[k].mid + , right, * k + );
}
} //查找算法
int query(int left, int right, int k, int pos){
if (left == right)
return interval[k].val;
if (pos <= interval[k].mid)
return interval[k].val + query(left, interval[k].mid, * k, pos);
else
return interval[k].val + query(interval[k].mid + , right, * k + , pos);
} int main(){
while (cin >> n >> m){
build(, maxn, );
rep(i, , n){
cin >> x >> y;
insert(x, --y, );
}
rep(i, , m){
cin >> x;
cout << query(, maxn, , x) << endl;
}
}
return ;
}

当然游戏到此还没有结束,发现这道题还有一种巧妙的解法

像这样只需要开一个数组point,对a,b线段操作的时候,把端点point[a++],point[b++]就可以了,

到时point[i]+=point[i-1]就可以了,这样就把每个点在几条线上同步了

比如point[c]+=point[a],从内部区间向外扩散这样就可以表示了,具体的还是看代码理解

 #include <stdio.h>
int point[];
int main(){
int n, m, i, a, b;
scanf("%d%d", &n, &m);
for (i = ; i <= n; i++){
scanf("%d%d", &a, &b);
point[a]++;
point[b]--;
}
for (i = ; i <= ; i++)
point[i] += point[i - ];
for (i = ; i <= m; i++){
int x;
scanf("%d", &x);
printf("%d\n", point[x]);
}
return ;
}

[Swust OJ 746]--点在线上(线段树解法及巧解)的更多相关文章

  1. 《白书》上线段树RMQ的实现

    白书上的线段树RMQ实现,自己重写了一遍: #include <bits/stdc++.h> using namespace std; const int MAXN=1<<17 ...

  2. hdu 3974 Assign the task(dfs序上线段树)

    Problem Description There is a company that has N employees(numbered from 1 to N),every employee in ...

  3. 【42%】【hdu1166】排兵布阵(树状数组解法&&线段树解法)

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...

  4. [JSOI2008]最大数 线段树解法

    题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...

  5. Comet OJ 茶颜悦色 线段树+扫描线(矩形覆盖最多点+优化)

    题目:https://www.cometoj.com/contest/59/problem/D?problem_id=2713 题意:给你一个正方形,然后给你n个点,这个正方形能随意放哪,要求那个正方 ...

  6. 洛谷P1908 逆序对(线段树解法)

    题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...

  7. 【BZOJ-4059】Non-boring sequences 线段树 + 扫描线 (正解暴力)

    4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 440  Solved: 16 ...

  8. CF666E Forensic Examination——SAM+线段树合并+倍增

    RemoteJudge 题目大意 给你一个串\(S\)以及一个字符串数组\(T[1...m]\),\(q\)次询问,每次问\(S\)的子串\(S[p_l...p_r]\)在\(T[l...r]\)中的 ...

  9. luogu P3180 [HAOI2016]地图 仙人掌 线段树合并 圆方树

    LINK:地图 考虑如果是一棵树怎么做 权值可以离散 那么可以直接利用dsu on tree+树状数组解决. 当然 也可以使用莫队 不过前缀和比较难以维护 外面套个树状数组又带了个log 套分块然后就 ...

随机推荐

  1. 命令 修改WAMP中mysql默认空密码

    WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空, WAMP安装 ...

  2. [转]iOS多线程编程之NSThread的使用

    1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue ...

  3. XMLTProcessor根据XSLT样式规则将节点转换为document对象

    最近使用Firefox进行网页的调试,发现有些javascript XSLT处理xml的语句仅仅支持IE浏览器.而网络中的一些介绍Javascript XSLT 处理XML的文章基本上都是依据Ajax ...

  4. Spring Boot Memory Performance

    The Performance Zone is brought to you in partnership with New Relic. Quickly learn how to use Docke ...

  5. 01_什么是Elasticsearch

    Logstash是一个开源的用于收集,分析和存储日志的工具. Kibana4用来搜索和查看Logstash已索引的日志的web接口.这两个工具都基于 Elasticsearch. Logstash: ...

  6. 【水一发next_permutation】poj 1146——ID Codesm

    来源:点击打开链接 求字典序下一位,没有直接输出没有.全排列函数秒水过. #include <iostream> #include <algorithm> #include & ...

  7. 自己动手写Java大整数《3》除法和十进制转换

    之前已经完毕了大整数的表示.绝对值的比較大小.取负值.加减法运算以及乘法运算. 详细见前两篇博客(自己动手写Java * ). 这里加入除法运算. 另外看到作者Pauls Gedanken在blog( ...

  8. BI商业智能项目中的若干风险要素

    BI商业智能项目应在 “业务驱动,总体规划,统一设计,分期实施” 的总体设计原则下分期实施,采取Agile BI方法论迭代开展,先确保核心功能满足客户需求,在总体规划下不断完善整个系统,以提高可交付性 ...

  9. Ext JS学习第六天 Ext_window组件(三)

    此文用来记录学习笔记: 今天再来一个例子巩固一下学习的window: –例2: 在window中添加子组件,并讲解常用查找组件的方式: •重点分析:该实例主要针对于组件的查找进行详细的讲解,在以后的应 ...

  10. js中使用this的一些注意事项

    先看看这段代码 var x =9; var fobj ={ x:1, test:function(callback){ var x= 2; callback(); } } function pp(){ ...