洛谷P1309 -瑞士輪
阿新 • • 發佈:2018-12-10
瑞士輪
題意很簡單,暴力點就是每次弄完都排序就OK了,但只有60分
考慮程式碼重複多餘的運算在哪,超複雜度是因為N次排序,但事實上不需要這麼多次排序,
或者說,每次對於N個隊,每個隊的勝者分數+1,依然大於排序後面隊的勝者,敗者+0也是如此。
組成兩個長度為N的陣列,歸併排序O(n)合併得出排序結果。
第一步排序手寫了個heapsort,實際上用sort就可以了,主要是暴力寫完第一遍懶得改了。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<string> #include<algorithm> #include<vector> #include<queue> #include<set> #include<map> #include<stack> #define FOR(a,b) for(register int i=a;i<=b;i++) #define LL long long using namespace std; struct node { int id; int w; int score; }A[200000]; void sift(node a[], int low, int high) { int i = low, j = 2 * i; node temp = a[i]; while (j <= high) { if (j < high&&((a[j].score > a[j + 1].score)||a[j].score==a[j+1].score&&a[j].id<a[j+1].id)) j++; if((temp.score > a[j].score)||(temp.score==a[j].score&&temp.id<a[j].id)) { a[i] = a[j]; i = j; j = 2 * i; } else break; }a[i] = temp; } void Heapsort(node a[], int n) { int i; for (i = n / 2; i >= 1; i--) { sift(a, i, n); } node temp; for (i = n; i >= 2; i--) { temp = a[i]; a[i] = a[1]; a[1] = temp; sift(a, 1, i - 1); } } node B[100010]; node C[100010]; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int N, R, Q; cin >> N >> R >> Q; FOR(1,2*N) { A[i].id = i; cin >> A[i].score; } FOR(1,2*N) { cin >> A[i].w; } Heapsort(A, 2*N); int cntb = 0, cntc = 0; int cnt = 0; FOR(1, R) { cntb = 0; cntc = 0; /* for (int i = 1; i <= 2 * N; i++) { cout << A[i].id<<":"<<A[i].score << " "; }*/ for (int j = 1; j <= N; j++) { if (A[2 * j - 1].w < A[2 * j].w) { A[2 * j].score++; B[++cntb] = A[2 * j]; C[++cntc] = A[2 * j - 1]; } else { A[2 * j - 1].score++; B[++cntb] = A[2 * j - 1]; C[++cntc] = A[2 * j]; } } cnt = 0; cntb = 1, cntc = 1; while (cntb <= N && cntc <= N) { if ((B[cntb].score > C[cntc].score) || (B[cntb].score == C[cntc].score&&B[cntb].id < C[cntc].id)) { A[++cnt] = B[cntb++]; } else A[++cnt] = C[cntc++]; } while (cntb <= N) { A[++cnt] = B[cntb++]; } while (cntc <= N) { A[++cnt] = C[cntc++]; } } cout << A[Q].id << endl; system("pause"); }