제출 #1169020

#제출 시각아이디문제언어결과실행 시간메모리
116902012345678코알라 (APIO17_koala)C++20
75 / 100
33 ms464 KiB
#include "koala.h" #include <bits/stdc++.h> using namespace std; const int nx=1e2+5; int minValue(int N, int W) { int qrs[nx], ans[nx]; for (int i=0; i<N; i++) qrs[i]=(i==0); playRound(qrs, ans); for (int i=1; i<N; i++) if (ans[i]==0) return i; return 0; } int maxValue(int N, int W) { int qrs[nx], ans[nx], per, t=4; vector<int> idx, nidx; for (int i=0; i<N;i ++) idx.push_back(i); while (t--) { per=W/idx.size(); for (int i=0; i<N; i++) qrs[i]=0; for (auto x:idx) qrs[x]=per; playRound(qrs, ans); for (int i=0; i<N; i++) if (qrs[i]>0&&ans[i]>qrs[i]) nidx.push_back(i); idx=nidx; nidx.clear(); } return idx[0]; } int solve(int x, int *qrs, int *ans, int a, int b) { qrs[a]=qrs[b]=x; playRound(qrs, ans); if (ans[a]<=qrs[a]&&ans[b]>qrs[b]) return -2; if (ans[a]>qrs[a]&&ans[b]<=qrs[b]) return -1; if (ans[a]<=qrs[a]||ans[b]<=qrs[b]) return 1; return 0; } int greatervalue(int N, int W, int x, int y) { // 1 when first is greater int qrs[nx], ans[nx]; for (int i=0; i<N; i++) qrs[i]=0; int l=1, r=10; while (l<r) { int md=(l+r)/2; int tmp=solve(md, qrs, ans, x, y); if (tmp==-1) return 1; if (tmp==-2) return 0; if (tmp) r=md-1; else l=md+1; } solve(l, qrs, ans, x, y); if (ans[x]>qrs[x]) return 1; else return 0; } int greaterValue(int N, int W) { return greatervalue(N, W, 1, 0); } int srt[nx], tmp[nx], n, w; bool comparesub4(int i, int j) { int qrs[nx], ans[nx]; for (int k=0; k<n; k++) qrs[k]=0; qrs[i]=qrs[j]=100; playRound(qrs, ans); if (ans[i]<=qrs[i]) return 1; else return 0; } bool maincompare(int i, int j, int t) { if (!t) return comparesub4(i, j); else return greatervalue(n, w, j, i); } void mergesort(int l, int r, int t) { if (l==r) return; int md=(l+r)/2, idxl=l, idxr=md+1, idx=l; mergesort(l, md, t); mergesort(md+1, r, t); while (idxl<=md||idxr<=r) { if (idxl>md) tmp[idx++]=srt[idxr++]; else if (idxr>r) tmp[idx++]=srt[idxl++]; else if (maincompare(srt[idxl], srt[idxr], t)) tmp[idx++]=srt[idxl++]; else tmp[idx++]=srt[idxr++]; } for (int i=l; i<=r; i++) srt[i]=tmp[i]; //cout<<"debug "<<l<<' '<<r<<' '<<srt[i]<<'\n'; } void allValues(int N, int W, int *P) { n=N; w=W; for (int i=0; i<N; i++) srt[i]=i; if (W >= 2*N) { mergesort(0, N-1, 0); } else { mergesort(0, N-1, 1); } for (int i=0; i<N; i++) P[srt[i]]=i+1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...