有n條船平行於x軸,已知初始時刻的位置,向平行於x軸正向或反向走。所有船速度大小一致。現在海哥站在x軸上,要給船拍照,角度為朝向+y方向的固定90度,可以在任意時刻、任意位置拍,問何時拍下的完整的船數量最多。
對於橫座標為[x, y] 縱座標為z的船而言,海哥可以移動的區間為[y-z, x+z]且y-z
≤ x+z。對於同向運動的船,它們在任意時刻的相對位置不發生改變,則可以記錄下每個位置可見的船數量bi
。得到兩個方向的bi
以後,相當於要求以某個位置為分界線,作為兩個方向bi
的最大值的相交位置。故要求向左走的船的字尾最大值m0
i ,以及向右走的船的字首最大值m1
i ,o(n)掃一遍得到ma
x[m0
i+m1
i]輸入多個線段位置,輸出各個位置重疊的線段個數。
輸入乙個線段[l,r]時,將位置s[l]++, s[r+1]–, 則統計如下:
b[0] = s[0];
for(int i = 1;i
< maxn;i++)
b[i] = b[i-1] + s[i];
由於橫座標的範圍在−10
6 ~106
,點數量在2×
105,因此可以將橫座標離散化。
/*--------------------------------------------
* author: danliwoo
* mail: [email protected]
* created time: 2016-05-29 17:18:58
--------------------------------------------*/
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define n 100100
struct node
node(int x, int y): x(x), y(y) {}
void pr()
}p[2][n];
int a[2*n], b[2][n], tn[2], an, num[2*n], s[2][n], m[2][n];
int find(int x)
return l;
}void solve()
int main()
sort(a, a+an); //離散化
unique(a, a+an);
a[an] = a[an-1];
for(int i = 0;i < an;i++)
if(a[i] >= a[i+1])
for(int k = 0;k < 2;k++)
b[k][0] = s[k][0];
for(int i = 1;i <= an;i++)
b[k][i] += b[k][i-1] + s[k][i];
}printf("case #%d:\n", ++o);
solve();
}return
0;}
2016 百度之星 複賽 拍照
小明在旅遊的路上看到了一條美麗的河,河上有許多船隻,有的船隻向左航行,有的船隻向右航行。小明希望拍下這一美麗的風景,並且把盡可能多的船隻都完整地拍到一張 中。小明位於河的邊上,並且可以在河邊的任意位置進行拍照,照相機的視野恰好為90度角,只能以垂直於河邊的方向進行拍照。河上的船隻全都可看作是平行於河...
百度之星複賽題解
problem description 眾所周知,度度熊非常喜歡數字。它最近在學習小學算術,第一次發現這個世界上居然存在兩位數,三位數 甚至n位數!但是這回的算術題可並不簡單,由於含有表示bomb的 號,度度熊稱之為 arithmetic of bomb。bomb number中的bomb,也就是 ...
2016百度之星 Problem B
度熊面前有乙個全是由1構成的字串,被稱為全1序列。你可以合併任意相鄰的兩個1,從而形成乙個新的序列。對於給定的乙個全1序列,請計算根據以上方法,可以構成多少種不同的序列。input 這裡包括多組測試資料,每組測試資料報含乙個正整數nn 代表全1序列的長度。1 n 2001 n 200 output ...