2768 圓圈遊戲(circle)

2022-09-01 04:57:08 字數 1471 閱讀 8062

題目描述

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

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

遊戲一次一次進行著,小k已經對遊戲的規則感到了厭倦,所以他決定修改遊戲的規則。對於第 $i$ 個圓,我們定義它的價值為 $w_i$ 。新的遊戲目標是使得選出的圓價值和最大(不一定數量最多)。但是圓圈可能很多,或者圓圈的分布非常奇怪,或者小k還有別的事情要做。所以他只好拜託你來幫他求出這個最大值了。

資料範圍

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

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

題解

暴力就 $n^2$ 判斷,建樹做 $dp$ ,於是考慮優化建樹過程

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

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

可以用 $set$ 維護

效率: $o(n\ logn)$

**

#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 nn 個圓,並把每個圓的圓心以及半徑都告訴小k。小h畫的 n nn 個圓中,任意兩個圓不會出現相交或相切的情況。小k需要做的就是從這 n nn 個圓中選出若干個圓,使得選出的任意乙個圓都不被另...

DTOJ 2768 圓圈遊戲(circle)

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

1 圓圈舞蹈(circle )

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