Submission #1081450

#TimeUsernameProblemLanguageResultExecution timeMemory
1081450kes0716Archery (IOI09_archery)C++17
90 / 100
432 ms14624 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(5*n); State pq = {0, 0, 0}; int i, j; for(i=0; i<n; i++){ pot[i] = init[i]; } int cnt = 0, last = -1; int lwin = (init[0].pl ? 1 : (init[0].ze ? 0 : -1)); for(i=0; i<4*n; i++){ pq = pq + pot[i]; int oppb; //printf("i=%d pq= +%d 0%d -%d\n", i, pq.pl, pq.ze, pq.mi); if(pq.pl >= 2){ oppb = 1; pot[i+n].pl++; pq.pl--; } else if(pq.pl == 1){ if(lwin == 1){ if(pq.ze){ oppb = 0; pot[i+n].ze++; pq.ze--; } else{ oppb = -1; pot[i+n].mi++; pq.mi--; } } else{ oppb = 1; pot[i+n].pl++; pq.pl--; } } else if(pq.ze && lwin){ oppb = 0; pot[i+n].ze++; pq.ze--; } else{ oppb = -1; pot[i+n].mi++; pq.mi--; } if(!lwin || !oppb) last = i; if(!oppb && lwin == 1) cnt++; else if(!lwin && oppb == 1) cnt++; lwin = max(lwin, oppb); } //printf("last=%d cnt=%d\n", last, cnt); int ret = last - r - n*cnt; 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=-4; t<=1; 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:123:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |  scanf("%d %d", &n, &r);
      |  ~~~~~^~~~~~~~~~~~~~~~~
archery.cpp:125:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  125 |  scanf("%d", &crit);
      |  ~~~~~^~~~~~~~~~~~~
archery.cpp:127:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  127 |   scanf("%d", &a[i]);
      |   ~~~~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...