description
了解奶牛們的人都知道,奶牛喜歡成群結隊.觀察約翰的n(1≤n≤100000)只奶牛,你會發現她們已經結成了幾個「群」.每只奶牛在吃草的時候有乙個獨一無二的位置座標xi,yi(l≤xi,yi≤[1..10^9];xi,yi∈整數.當滿足下列兩個條件之一,兩隻奶牛i和j是屬於同乙個群的:
1.兩隻奶牛的曼哈頓距離不超過c(1≤c≤10^9),即lxi - xil+iyi - yil≤c.
2.兩隻奶牛有共同的鄰居.即,存在乙隻奶牛k,使i與k,j與k均同屬乙個群.
給出奶牛們的位置,請計算草原上有多少個牛群,以及最大的牛群裡有多少奶牛
input
第1行輸入n和c,之後n行每行輸入乙隻奶牛的座標.
output
僅一行,先輸出牛群數,再輸出最大牛群裡的牛數,用空格隔開.
sample input
4 21 1
3 32 2
10 10
sample output
2 3【題解】
本題需要求曼哈頓距離,並且在尋找鄰居的時候只要找距離自己最近的奶牛看看與它是否屬於同乙個群。很容易想到使用平衡樹求前驅和後繼,但是求曼哈頓距離的公式|x1-x2|+|y1-y2|很難維護。
所以我們要對資料進行處理,講每個點變為(x+y,x-y),這樣曼哈頓距離就是max(|x1-x2|,|y1-y2|)。每次比較只要比較兩個點的乙個值就可以了。
所以我們用乙個佇列維護x,用乙個平衡樹(或者multiset)去維護y。找到合法的就用並查集將兩個合在一起。
1 #include2using
namespace
std;
3#define maxn 100005
4#define ll long long
5int
f[maxn],tot[maxn];
6int
n,m,ans,mx;
7ll c;
8struct
nodea[maxn];
11 inline int
read()
14while(ch>='
0'&&ch<='9')
15return x*f;16}
17 multisetb;
18 multiset:: iterator it;
19bool
cmp(node a,node b)
22bool
operator
<(node a,node b)
23int find(int
x)27
void work(int x,int y)33}
34void
solve()48}
49int
main()
60solve();
61for(int i=1;i<=n;i++)mx=max(tot[i],mx);
62 printf("
%d %d
",ans,mx);
63return0;
64 }
bzoj1635 最高的牛
初始如果沒有限制,很顯然每一頭牛高度都是h 當只有乙個限制,讓h a 到h b 的高度都減1即可 容易發現兩個限制不會相交 否則必然矛盾 只會包含或相離,因此沒有影響,直接差分 線段樹即可 注意 1.不保證a 1 include2 using namespace std 3struct jia 10...
BZOJ 1051, 受歡迎的牛
傳送門 求可以被除自己以外所有點遍歷到的點的個數。首先強連通分量跑一遍,縮點之後統計每個強連通分量 可以視為乙個點 的出度。如果有多個出度大於0,則無解 否則輸出唯一出度為0的強連通分量內點的個數。include const int n 10005,m 50005 int n,m,x,y,i,j,t...
bzoj1051 受歡迎的牛
每一頭牛的願望就是變成一頭最受歡迎的牛。現在有n頭牛,給你m對整數 a,b 表示牛a認為牛b受歡迎。這種關係是具有傳遞性的,如果a認為b受歡迎,b認為c受歡迎,那麼牛a也認為牛c受歡迎。你的任務是求出有多少頭牛被所有的牛認為是受歡迎的。第一行兩個數n,m。接下來m行,每行兩個數a,b,意思是a認為b...