[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 套分块然后就 ...
随机推荐
- python -- 计算数学题--用程序解决问题1
1.#一个四位数,各位数字互不相同,所有数字之和等于6,并且这个数是11的倍数,#则满足这种要求的四位数有多少个? 代码如下: # -*- coding: UTF-8 -*-import systyp ...
- c语言各类问题 代码
定义一个结构体,有两个成员变量,一个整型的n,一个字符型的c,利用结构体类型声明一个具有5个元素的数组,并随机初始化,根据成员变量n进行从小到大排序,然后输出 冒泡排序然后 在输出结构体#includ ...
- 为sublime安装package control 解决乱码问题 Mac版
为sublime安装package control Mac版参考 https://sublime.wbond.net/installation 防止中文乱码其实只需要2个东东 一个GBK enc ...
- 25_Downloading An Image
一个App,从网上下载一张图片(给出图片地址),重新命名,然后保存到手机中,再从手机中取出显示在屏幕上. 难度不大,就是找图片很蛋疼,百度搜索出来的过一会儿会失效,Google搜索出来的有些需要FQ, ...
- Qt中QPushButton、QTabWidget等部件内容文字换行的解决方法(一定要写在源码里,写在翻译文件里不行,因为\n得不到转义)
最近在做基于Qt的应用项目,其中有一个按钮文字超长,需要换一行显示.从网上找到的建议都是将要显示的内容做成图片,然后将图片设置为该按钮的背景.但是这样做有一个很大的局限性,当需要更改内容文字的时候,需 ...
- Windows Azure 网站上的 WordPress 3.8
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 和 Windows Azure 网站开发人员体验合作伙伴共同撰写. WordPr ...
- Poj 2232 Moo Volume(排序)
题目链接:http://poj.org/problem?id=2231 思路分析:先排序,再推导计算公式. 代码如下: #include <iostream> #include <a ...
- LeetCode :Word Ladder II My Solution
Word Ladder II Total Accepted: 11755 Total Submissions: 102776My Submissions Given two words (start ...
- hdu1281结题报告
哎哎...自己刚刚一看到这个题目居然.....什么都想不到...看了一下别人的解题报告说最大匹配...于是就自己开始构思啦... 对于这个棋盘,有K个可以放棋子的位置....那么 首先我们开始可以求出 ...
- IT忍者神龟之Struts2.xml配置全然正确流程能走通可是有红叉解决
一:Multiple annotations found at this line:Undefined actionName parameter Undefined actionnamespace ...