题目链接: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. Jps介绍以及解决jps无法查看某个已经启动的java进程问题【盗用】

    1.jps的作用 jps类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是当前用户已启动的部分java进程信息,信息包括进程号和简短的进程command. 2 ...

  2. JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)

    // 获取RFC返回的字段值 11 JCoParameterList exportParam = function.getExportParameterList(); 12 String exPara ...

  3. nrf51 官方PWM库

    地址:https://github.com/NordicSemiconductor/nrf51-pwm-library nrf_pwm_init函数 初始化PWM参数 设置输出pwm的gpio pin ...

  4. GC算法之串行并行并发

    串行收集器: 用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器.当然,此收集器也可以用在小数据量(100M左右)情况下的多 ...

  5. C#调用Matlab生成的dll方法

    其实整个过程比较简单,但是需要心细一点. 需要的工具:VS2005及以上版本,MATLAB2008B及以上版本,另外非常重要的需要安装一个MATLAB Compiler Runtime,这个文件(MC ...

  6. 菜农群课笔记之ICP与ISP----20110412(整理版)

    耗时一上午时间对HOT大叔昨晚的群课内容进行温故并整理,现将其上传,若想看直播可到下面链接处下载:http://bbs.21ic.com/icview-229746-1-1.html        成 ...

  7. 调色板QPalette类用法详解(附实例、源码)(很清楚:窗口背景色 前景色 按钮的颜色 按钮文本的颜色 )

    http://blog.csdn.net/rl529014/article/details/51589096

  8. GCD自己做的一些简单总结

    GCD总结 GCD  Grand Central Dispatch  牛逼的中枢调度器 GCD中各种队列的执行效果 想看线程  必须是异步函数  并且不是主队列 注意:使用sync函数往当前串行队列添 ...

  9. Failed to upgrade Oracle Cluster Registry configuration(root.sh)

        近期在给客户基于Suse 11 sp3安装Oracle 10g RAC,在安装完clusterware运行/u01/app/crs/root.sh时收到错误提示.Failed to upgra ...

  10. 编译和安装shibboleth-sp遇到的问题

    In file included from mod_shib_20.cpp:68: mod_shib.cpp:118: warning: deprecated conversion from stri ...