2768 圓圈遊戲(circle)

2021-09-25 22:17:25 字數 1619 閱讀 8185

在無聊的時候,小k和小h會在紙上玩這樣乙個遊戲。

我們可以將紙看做乙個平面直角座標系。小h會先在上面畫出 n

nn 個圓,並把每個圓的圓心以及半徑都告訴小k。小h畫的 n

nn 個圓中,任意兩個圓不會出現相交或相切的情況。小k需要做的就是從這 n

nn 個圓中選出若干個圓,使得選出的任意乙個圓都不被另乙個選出的圓包含。遊戲的目標就是要選出盡量多的圓。

遊戲一次一次進行著,小k已經對遊戲的規則感到了厭倦,所以他決定修改遊戲的規則。對於第 i

ii 個圓,我們定義它的價值為 w

iw_i

wi​ 。新的遊戲目標是使得選出的圓價值和最大(不一定數量最多)。但是圓圈可能很多,或者圓圈的分布非常奇怪,或者小k還有別的事情要做。所以他只好拜託你來幫他求出這個最大值了。

n

≤100000,1

≤xi,

yi,r

i≤10

8,1≤

wi

≤1000

n \le 100000,1 \le x_i,y_i,r_i \le 10^8,1 \le w_i \le 1000

n≤1000

00,1

≤xi​

,yi​

,ri​

≤108

,1≤w

i​≤1

000。

保證不存在相交或相切的兩個圓。

暴力就 n

2n^2

n2判斷,建樹做 dpdp

dp,於是考慮優化建樹過程

考慮掃瞄線,維護一些上圓弧和下圓弧,使得它們以縱座標排序

然後每次新增加乙個圓,只要看它上圓弧的上一條圓弧,如果上一條是上圓弧,則它被上一條圓弧所在圓包含,若是下圓弧,則他倆被包含情況是一樣的

可以用 set

setse

t 維護

效率: o(n

logn

)o(n\ logn)

o(nlog

n)

#include #define eps 1e-5

using namespace std;

const int n=1e5+5;

int n,hd[n],v[n],nx[n],t,a[n],w[n],x,f[n];

struct op[n<<1];

double s(int x)

struct m

}g;sets;set::iterator it;

bool cmp(o a,o b)

void add(int u,int v)

void dfs(int x)

int main();

p[++t]=(o);

} sort(p+1,p+t+1,cmp);t=0;

for (int i=1;i<=n+n;i++)));

s.erase(s.find((m)));

} else);

s.insert((m));

it=s.find((m));

if (it!=s.begin())

else add(0,p[i].i);

} }return dfs(0),printf("%d\n",w[0]),0;

}

2768 圓圈遊戲(circle)

題目描述 在無聊的時候,小k和小h會在紙上玩這樣乙個遊戲。我們可以將紙看做乙個平面直角座標系。小h會先在上面畫出 n 個圓,並把每個圓的圓心以及半徑都告訴小k。小h畫的 n 個圓中,任意兩個圓不會出現相交或相切的情況。小k需要做的就是從這 n 個圓中選出若干個圓,使得選出的任意乙個圓都不被另乙個選出...

DTOJ 2768 圓圈遊戲(circle)

題目描述 在無聊的時候,小 k 和小 h 會在紙上玩這樣乙個遊戲。我們可以將紙看做乙個平面直角座標系。小 h 會先在上面畫出 n 個圓,並把每個圓的圓心以及半徑都告訴小 k 小 h 畫的 n 個圓中,任意兩個圓不會出現相交或相切的情況。小 k 需要做的就是從這 n 個圓中選出若干個圓,使得選出的任意...

1 圓圈舞蹈(circle )

1 圓圈舞蹈 circle.問題描述 熊大媽的奶牛圍成了乙個圈在跳圓舞曲。由於沒有嚴格的教育,奶牛們之間的間隔距離不一致,現在告訴你相鄰兩個奶牛間的距離,熊大媽想知道兩隻最遠的奶牛到底隔了多遠。奶牛a到b的距離為a順時針走或逆時針走到達b的較短距離。輸入格式 第一行乙個整數n,表示有n只奶牛。接下來...