2016百度之星複賽 1003 拍照 掃瞄線

2021-07-12 04:30:39 字數 1721 閱讀 5324

有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 ...