试题请参见: https://vijos.org/p/1066
题目概述
永恒和mx正在玩一个即时战略游戏, 名字嘛~~~~~~恕本人记性不好, 忘了-_-b.
mx在他的基地附近建立了n个战壕, 每个战壕都是一个独立的作战单位, 射程可以达到无限(“mx不赢定了?!?”永恒ftING...@_@).
但是, 战壕有一个弱点, 就是只能攻击它的左下方, 说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT). 这样, 永恒就可以从别的地方进攻摧毁战壕, 从而消灭mx的部队.
战壕都有一个保护范围, 同它的攻击范围一样, 它可以保护处在它左下方的战壕. 所有处于它保护范围的战壕都叫做它的保护对象. 这样, 永恒就必须找到mx的战壕中保护对象最多的点, 从而优先消灭它.
现在, 由于永恒没有时间来计算, 所以拜托你来完成这个任务:
给出这n个战壕的坐标xi、yi, 要你求出保护对象个数为0, 1, 2……n-1的战壕的个数.
mx在他的基地附近建立了n个战壕, 每个战壕都是一个独立的作战单位, 射程可以达到无限(“mx不赢定了?!?”永恒ftING...@_@).
但是, 战壕有一个弱点, 就是只能攻击它的左下方, 说白了就是横纵坐标都不大于它的点(mx:“我的战壕为什么这么菜”ToT). 这样, 永恒就可以从别的地方进攻摧毁战壕, 从而消灭mx的部队.
战壕都有一个保护范围, 同它的攻击范围一样, 它可以保护处在它左下方的战壕. 所有处于它保护范围的战壕都叫做它的保护对象. 这样, 永恒就必须找到mx的战壕中保护对象最多的点, 从而优先消灭它.
现在, 由于永恒没有时间来计算, 所以拜托你来完成这个任务:
给出这n个战壕的坐标xi、yi, 要你求出保护对象个数为0, 1, 2……n-1的战壕的个数.
输入
第一行,一个正整数n(1<=n<=15000)
接下来n行,每行两个数xi,yi,代表第i个点的坐标
(1<=xi,yi<=32000)
注意:可能包含多重战壕的情况(即有数个点在同一坐标)
接下来n行,每行两个数xi,yi,代表第i个点的坐标
(1<=xi,yi<=32000)
注意:可能包含多重战壕的情况(即有数个点在同一坐标)
输出
输出n行, 分别代表保护对象为0, 1, 2……n-1的战壕的个数.
解题思路
乍看一眼觉得很复杂, 真的理解题意之后发现弱爆了.
对于每一个战壕, 查找坐标不超过自身的点, 并存储结果.
查找时, 会将战壕本身也计算在内, 因此我们计算完成后, 需要减去1(当前战壕本身).
遇到的问题
完全木有算法可言的题目, 连朴素O(n^2)算法都AC了.
源代码
#include <iostream>
#include <fstream>
struct Point {
int x;
int y;
};
int main() {
using std::cin;
// std::ifstream cin;
// cin.open("input.txt");
const int MAX_TRENCHES = 15000;
int n = 0;
Point trenches[MAX_TRENCHES];
int counter[MAX_TRENCHES] = {0};
// Input
cin >> n;
for ( int i = 0; i < n; ++ i ) {
cin >> trenches[i].x >> trenches[i].y;
}
// Processing
for ( int i = 0; i < n; ++ i ) {
int totalProtected = 0;
for ( int j = 0; j < n; ++ j ) {
if ( trenches[j].x <= trenches[i].x && trenches[j].y <= trenches[i].y ) {
++ totalProtected;
}
}
++ counter[totalProtected - 1];
}
// Output
for ( int i = 0; i < n; ++ i ) {
std::cout << counter[i] << std::endl;
}
return 0;
}