int b_s(int l,int r,int x) { if(r-l < 2) { if(D[r] < x) return r; return l; } int mid = (l+r)/2; if(D[mid] < x) return b_s(mid, r, x); return b_s(l, mid, x); }
string getHint(string secret, string guess) { int n = secret.size(); vector<int> b_s(10,0); // 10 buckets for 10 digits 0 - 9. vector<int> b_g(10,0); // go through secret & guess simultaneously, count bulls and count all others into their buckets. int bulls = 0; for(int i=0; i<n; i++) { if(secret[i] == guess[i]) { bulls++; } else { b_s[secret[i] - '0']++; b_g[guess[i] - '0']++; } } int cows = 0; for(int i=0; i<10; i++) { cows += min(b_s[i], b_g[i]); } // Now generate output. Note that bulls and cows can be multiple digits std::ostringstream temp; temp << bulls << 'A' << cows << 'B'; string s = temp.str(); return s; }
int main() { scanf("%d",&n); for(int h=1; h<=n; h++) D[h] = MAXN; for(int h=0; h<n; h++) { int a; scanf("%d",&a); int k = b_s(0, n-1, a); if(D[k+1] > a) D[k+1] = a; ans = ma(k+1, ans); } printf("%d",ans); }