[Swust OJ 746]--点在线上(线段树解法及巧解)
题目链接:http://acm.swust.edu.cn/problem/746/
fate是一个数学大牛,热衷于各种数学问题.一次toshio,lo和fate玩了一个很简单的游戏.
在一条长40000的数轴上toshio说了M条线段的位置,每条线段给了头和尾的坐标,每条线的坐标都小于等于40000.
由lo发起N个提问,提问任意说一个点的坐标,要fate说出这个点在多少条线段上.
两个整数M和N(0 < N,M <= 40000)
以下M行,每行两个整数b[i],e[i](0 <= b[i] < e[i] <= 40000)表示第i条线段的两个坐标.(注:点b[i]在线段上,但e[i]不在线段上.)
接下来N行,每行一个整数,表示lo询问的点的坐标.
N行输出
对于lo询问的N个点,每个点分别在几条线段上.
|
1
2
3
4
5
6
7
8
9
|
4 3
1 5
2 6
3 7
4 8
2
5
9
|
|
1
2
3
4
|
2
3
0
|
/************************线段树******************************/ #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]--点在线上(线段树解法及巧解)的更多相关文章
- 《白书》上线段树RMQ的实现
白书上的线段树RMQ实现,自己重写了一遍: #include <bits/stdc++.h> using namespace std; const int MAXN=1<<17 ...
- hdu 3974 Assign the task(dfs序上线段树)
Problem Description There is a company that has N employees(numbered from 1 to N),every employee in ...
- 【42%】【hdu1166】排兵布阵(树状数组解法&&线段树解法)
Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...
- [JSOI2008]最大数 线段树解法
题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前数列的长度. 2. 插入操作 ...
- Comet OJ 茶颜悦色 线段树+扫描线(矩形覆盖最多点+优化)
题目:https://www.cometoj.com/contest/59/problem/D?problem_id=2713 题意:给你一个正方形,然后给你n个点,这个正方形能随意放哪,要求那个正方 ...
- 洛谷P1908 逆序对(线段树解法)
题目描述 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定 ...
- 【BZOJ-4059】Non-boring sequences 线段树 + 扫描线 (正解暴力)
4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 440 Solved: 16 ...
- CF666E Forensic Examination——SAM+线段树合并+倍增
RemoteJudge 题目大意 给你一个串\(S\)以及一个字符串数组\(T[1...m]\),\(q\)次询问,每次问\(S\)的子串\(S[p_l...p_r]\)在\(T[l...r]\)中的 ...
- luogu P3180 [HAOI2016]地图 仙人掌 线段树合并 圆方树
LINK:地图 考虑如果是一棵树怎么做 权值可以离散 那么可以直接利用dsu on tree+树状数组解决. 当然 也可以使用莫队 不过前缀和比较难以维护 外面套个树状数组又带了个log 套分块然后就 ...
随机推荐
- Jps介绍以及解决jps无法查看某个已经启动的java进程问题【盗用】
1.jps的作用 jps类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是当前用户已启动的部分java进程信息,信息包括进程号和简短的进程command. 2 ...
- JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)
// 获取RFC返回的字段值 11 JCoParameterList exportParam = function.getExportParameterList(); 12 String exPara ...
- nrf51 官方PWM库
地址:https://github.com/NordicSemiconductor/nrf51-pwm-library nrf_pwm_init函数 初始化PWM参数 设置输出pwm的gpio pin ...
- GC算法之串行并行并发
串行收集器: 用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器.当然,此收集器也可以用在小数据量(100M左右)情况下的多 ...
- C#调用Matlab生成的dll方法
其实整个过程比较简单,但是需要心细一点. 需要的工具:VS2005及以上版本,MATLAB2008B及以上版本,另外非常重要的需要安装一个MATLAB Compiler Runtime,这个文件(MC ...
- 菜农群课笔记之ICP与ISP----20110412(整理版)
耗时一上午时间对HOT大叔昨晚的群课内容进行温故并整理,现将其上传,若想看直播可到下面链接处下载:http://bbs.21ic.com/icview-229746-1-1.html 成 ...
- 调色板QPalette类用法详解(附实例、源码)(很清楚:窗口背景色 前景色 按钮的颜色 按钮文本的颜色 )
http://blog.csdn.net/rl529014/article/details/51589096
- GCD自己做的一些简单总结
GCD总结 GCD Grand Central Dispatch 牛逼的中枢调度器 GCD中各种队列的执行效果 想看线程 必须是异步函数 并且不是主队列 注意:使用sync函数往当前串行队列添 ...
- Failed to upgrade Oracle Cluster Registry configuration(root.sh)
近期在给客户基于Suse 11 sp3安装Oracle 10g RAC,在安装完clusterware运行/u01/app/crs/root.sh时收到错误提示.Failed to upgra ...
- 编译和安装shibboleth-sp遇到的问题
In file included from mod_shib_20.cpp:68: mod_shib.cpp:118: warning: deprecated conversion from stri ...