题目链接: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. python -- 计算数学题--用程序解决问题1

    1.#一个四位数,各位数字互不相同,所有数字之和等于6,并且这个数是11的倍数,#则满足这种要求的四位数有多少个? 代码如下: # -*- coding: UTF-8 -*-import systyp ...

  2. c语言各类问题 代码

    定义一个结构体,有两个成员变量,一个整型的n,一个字符型的c,利用结构体类型声明一个具有5个元素的数组,并随机初始化,根据成员变量n进行从小到大排序,然后输出 冒泡排序然后 在输出结构体#includ ...

  3. 为sublime安装package control 解决乱码问题 Mac版

    为sublime安装package control   Mac版参考 https://sublime.wbond.net/installation 防止中文乱码其实只需要2个东东  一个GBK enc ...

  4. 25_Downloading An Image

    一个App,从网上下载一张图片(给出图片地址),重新命名,然后保存到手机中,再从手机中取出显示在屏幕上. 难度不大,就是找图片很蛋疼,百度搜索出来的过一会儿会失效,Google搜索出来的有些需要FQ, ...

  5. Qt中QPushButton、QTabWidget等部件内容文字换行的解决方法(一定要写在源码里,写在翻译文件里不行,因为\n得不到转义)

    最近在做基于Qt的应用项目,其中有一个按钮文字超长,需要换一行显示.从网上找到的建议都是将要显示的内容做成图片,然后将图片设置为该按钮的背景.但是这样做有一个很大的局限性,当需要更改内容文字的时候,需 ...

  6. Windows Azure 网站上的 WordPress 3.8

     编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 和 Windows Azure 网站开发人员体验合作伙伴共同撰写. WordPr ...

  7. Poj 2232 Moo Volume(排序)

    题目链接:http://poj.org/problem?id=2231 思路分析:先排序,再推导计算公式. 代码如下: #include <iostream> #include <a ...

  8. LeetCode :Word Ladder II My Solution

    Word Ladder II Total Accepted: 11755 Total Submissions: 102776My Submissions Given two words (start  ...

  9. hdu1281结题报告

    哎哎...自己刚刚一看到这个题目居然.....什么都想不到...看了一下别人的解题报告说最大匹配...于是就自己开始构思啦... 对于这个棋盘,有K个可以放棋子的位置....那么 首先我们开始可以求出 ...

  10. IT忍者神龟之Struts2.xml配置全然正确流程能走通可是有红叉解决

    一:Multiple annotations found at this line:Undefined actionName  parameter  Undefined actionnamespace ...