vijos1883 月光的魔法

2021-07-16 22:10:48 字數 1378 閱讀 2895

背景

影幾欺哄了眾生了 天以外—— 月兒何曾圓缺 描述

有些東西就如同月光的魔法一般.

luke是愛著vijos的. 他想為自己心愛的東西畫些什麼.

就畫n個圓吧. 把它們的圓心都固定在x軸上.

圓與圓. 為了愛,兩兩不能相交. 為了愛,它們可以互相貼在一起. 內切或外切,都是允許的.

vijos的美麗,在於人心. vijos的孩子們,一定能告訴大家:luke畫的圓究竟把平面分割成了多少塊?

月光恬美地灑在大地上. luke知道,如果什麼都不畫,平面就只有一塊.多美呢! luke知道,只畫乙個圓,平面就分成了兩塊.也很美呢!

但luke還是要多畫一些的,因為他真的深愛著vijos呢. 格式 輸入格式

輸入資料第一行:輸出乙個整數n,1<=n<=300,000.表示圓的個數.

之後n行,每一行有2個整數,x[i]和r[i]表示圓心固定在x[i]的位置,半徑為r[i].

-1,000,000,000<=x[i]<=1,000,000,000 1<=r[i]<=1,000,000,000 所有圓都是唯一的,不會出現重疊. 輸出格式

輸出只有一行,要求輸出平面被分割成了多少塊.

正常情況下,乙個圓只會多分出來一塊,但是如果乙個圓裡恰有幾個彼此相切的小圓,就會再把這個大圓上下分開。

所以可以離散化之後按半徑排序,用線段樹維護目前已經被小圓覆蓋到的區間。對於乙個圓,如果他的直徑已經完全被覆蓋,他對答案的貢獻就是2,否則就是1。然後再用這個圓去覆蓋。

#include

#include

#include

using namespace std;

struct inter

}void up(int p)

}void build(int p,int ll,int rr)

int find(int p,int ll,int rr,int l,int r)

void mark(int p,int ll,int rr,int l,int r)

down(p);

int mid=(ll+rr)/2;

if (r<=mid) mark(lson[p],ll,mid,l,r);

else

}up(p);

}int main()

sort(ord+1,ord+m+1);

m=unique(ord+1,ord+m+1)-ord-1;

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

sort(a+1,a+n+1);

build(1,1,m-1);

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

printf("%d\n",ans);

}

vijos1883 月光的魔法《遞迴》

這道題還有另外一種版本叫天神下凡,屬於模擬題,可是模擬題資料太水以至於模擬題a了都不一定在vijos上a。在模擬題裡我用的是一種類似掃瞄線的方式,完美ac,然後在vijos上就是只能過2組 最後經同學提點改為遞迴才a了 這道題我們把圓看成線段,所以這題就是線段覆蓋,然後答案是被完全覆蓋的線段數 所有...

P1883函式題解

這道題是說在 0,1000 中找到乙個值,使得在所有函式中這個值所對應的最大值最小 可能描述的不清楚,詳細看題目 通過畫圖發現,如果將最大值連線起來的話,那麼所有的點將連成乙個類似二次函式的影象,於是我們可以採用三分的方法,如果進行暴力列舉的話會超時,所以使用三分法。為什麼不用二分呢?二分是不能夠判...

洛谷 P1883 函式

給定n個二次函式f1 x f2 x fn x 均形如ax 2 bx c 設f x max,求f x 在區間 0,1000 上的最小值。輸入格式 輸入第一行為正整數t,表示有t 組資料。每組資料第一行乙個正整數n,接著n行,每行3個整數a,b,c 用來表示每個二次函式的3個係數,注意二次函式有可能退化...