題目簡單描述:給你n個點的座標(x, y),均爲浮點數。node
若是任意兩個點之間的歐幾里得距離小於給定的一個浮點值,則認爲這兩個點之間有關聯,而且關聯具備傳遞性,總之就是儘量擴大一個集合。編程
輸入:網絡
d 歐式距離spa
n 用戶數code
接下來每一個用戶的座標。視頻
2.0
5
3.0 5.0
6.0 13.0
2.0 6.0
7.0 12.0
0.0 2.0blog
輸出:string
[[0, 2], [1, 3], [4]]it
實現:並查集的應用io
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <set> #include <algorithm> #include <vector> using namespace std; struct node { double x, y; }cur; int fa[10000]; double disE(node A, node B) { return ( fabs(A.x - B.x)*fabs(A.x - B.x) + fabs(A.y-B.y)*fabs(A.y-B.y) ); } int findset(int x) { return fa[x]!=x ? fa[x] = findset(fa[x]) : x; } int main() { double dis; int n; scanf("%lf", &dis); scanf("%d", &n); vector<node>q; double a, b; for(int i=0; i<n; i++) { scanf("%lf %lf", &a, &b); cur.x = a; cur.y = b; q.push_back(cur); } for(int i=0; i<n; i++) { fa[i] = i; } dis = dis * dis; for(int i=0; i<q.size(); i++) { for(int j=0; j<q.size(); j++) { if(disE(q[i], q[j]) <= dis) { // fa[findset(j)] = findset(i); int xx = findset(i); int yy = findset(j); if(xx == yy) continue; else if(xx < yy) fa[yy] = xx; else if(xx > yy) fa[xx] = yy; } } } for(int i=0; i<n; i++) { if(fa[i] != i) fa[i] = findset(fa[i]); } printf("["); bool first=true; for(int i=0; i<n; i++) { if(fa[i] == i) { if(first == false) printf(", "); first = false; printf("["); printf("%d", i); for(int j=i+1; j<n; j++) { if(fa[j] == i) printf(", %d", j); } printf("]"); } } printf("]\n"); return 0; }
時間限制:2秒
空間限制:49152K
彈幕是現今網絡視頻常見的評論方式,可以反映一個視頻的火爆程度。假設某個時間一共有N條彈幕,每條彈幕i的持續時間爲兩個整數表示的時間區間(a[i],b[i]),咱們定義彈幕數量最多的一個時間段爲最精彩時段,求一個視頻的最精彩時段。
第一行整數N,表明彈幕的條數,其中90%的 N < 1000000, 60%的N < 10000
第二行到第N+1行,是兩個整數(a[i],b[i]),表明每條彈幕的開始時間和結束時間, 請注意(a[i],b[i])是全開區間, 而且a[i], b[i] < 100
M行,每行兩個整數(c,d),M是答案個數,(c,d)表明視頻最精彩時段的開始時間和結束時間,而且M個答案區間互不重疊。答案請按照開始時間從小到大輸出。請注意每行結尾應包含換行符,包括最後一行。
輸入輸出的樣例參見牛客網的題目
經過的代碼:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <set> #include <algorithm> #include <vector> using namespace std; int f[1000001]; set<int>bound; int main() { int n; scanf("%d", &n); memset(f, 0, sizeof(f)); while(n--) { int a, b; scanf("%d %d", &a, &b); bound.insert(a); bound.insert(b); for(int i=a+1; i<=b; i++) f[i]++; } int big = 0; for(int i=0; i<100; i++) { if(f[i] > big) big = f[i]; } int left, right; for(int i=1; i<100; i++) { if(f[i] == big) { left = i-1; int j=i; while(f[j] == big && bound.find(j) == bound.end()) { j++; } right = j; // printf("***\n"); printf("%d %d\n", left, right); i=j; } } return 0; }