Submission #1081372

#TimeUsernameProblemLanguageResultExecution timeMemory
1081372kes0716Archery (IOI09_archery)C++17
90 / 100
291 ms12636 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 200009; int n, r, crit; int a[2*MAXN]; struct State{ int pl, ze, mi; State operator+(const State &s) const{ return (State){pl+s.pl, ze+s.ze, mi+s.mi}; } } init[MAXN]; int simulate1(void){ vector<State> pot(3*n); State pq = {0, 0, 0}; int i, j; for(i=0; i<n; i++){ pot[i] = init[i]; } int cnt = 0, last = -1; for(i=0; i<3*n; i++){ pq = pq + pot[i]; //printf("i=%d pq= +%d 0%d -%d\n", i, pq.pl, pq.ze, pq.mi); assert(pq.pl + pq.ze + pq.mi >= 2); if(pq.pl < 2 && pq.ze) last = i; if(pq.pl >= 2){ if(i < 2*n) pot[i+n].pl++; pq.pl--; } else if(pq.pl == 1){ if(pq.ze){ if(i < 2*n) pot[i+n].ze++; pq.ze--; cnt++; } else{ if(i < 2*n) pot[i+n].mi++; pq.mi--; } } else{ if(i < 2*n) pot[i+n].mi++; pq.mi--; } } //printf("last=%d cnt=%d\n", last, cnt); int ret = last - r - n*(cnt-1); return ret; } int simulate2(int pos){ State pq = {0, 0, 0}; int i, ans = pos; for(i=2*n; i>=1; i--){ int cur = i%n; pq = pq + init[cur]; //printf("i=%d pq.pl=%d ze=%d mi=%d\n", i,pq.pl, pq.ze, pq.mi); init[cur].pl = init[cur].mi = init[cur].ze = 0; if(cur){ if(pq.mi){ if(pq.ze) ans--; init[cur].mi = 1; pq.mi--; } else if(pq.ze){ init[cur].ze = 1; pq.ze--; } } else{ if(pq.ze) ans--; } } return ans; } int simulate(int p){ int i, j=0; for(i=0; i<n; i++){ init[i].pl = init[i].ze = init[i].mi = 0; if(p == i) init[i].ze++; else{ if(a[j] < crit) init[i].pl++; else init[i].mi++; j++; } if(a[j] < crit) init[i].pl++; else init[i].mi++; j++; } if(crit <= n+1) return simulate1(); return simulate2(p); } int main(){ int i; scanf("%d %d", &n, &r); r = 2*n + r%n; scanf("%d", &crit); for(i=0; i<2*n-1; i++){ scanf("%d", &a[i]); } if(crit==1){ printf("%d\n", n); return 0; } pair<int, int> ans = make_pair(n, -1); //(result, -start) for(int t=-3; t<=0; t++){ int goal = t*n, lo = 0, hi = n-1, mid; while(lo < hi){ mid = (lo+hi)/2; if(simulate(mid) >= goal) hi = mid; else lo = mid+1; } int crit = simulate(lo); //printf("lo=%d crit=%d\n", lo, crit); hi = n-1; while(lo < hi){ mid = (lo+hi+1)/2; if(simulate(mid) == crit) lo = mid; else hi = mid-1; } //printf("lo=%d\n", lo); ans = min(ans, make_pair((crit%n + n)%n, -lo-1)); } printf("%d\n", -ans.second); return 0; }

Compilation message (stderr)

archery.cpp: In function 'int simulate1()':
archery.cpp:15:9: warning: unused variable 'j' [-Wunused-variable]
   15 |  int i, j;
      |         ^
archery.cpp: In function 'int main()':
archery.cpp:107:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  107 |  scanf("%d %d", &n, &r);
      |  ~~~~~^~~~~~~~~~~~~~~~~
archery.cpp:109:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  109 |  scanf("%d", &crit);
      |  ~~~~~^~~~~~~~~~~~~
archery.cpp:111:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  111 |   scanf("%d", &a[i]);
      |   ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...