題目描述
在無聊的時候,小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-5using
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只奶牛。接下來...