usingnamespacestd; constint MAX = 1e6 + 5; int lastPos[MAX]; int seq[MAX]; int origin[MAX]; bool marked[MAX];
intmain(){ //std::ios::sync_with_stdio(false); //std::cin.tie(0); int n; int k; int tmp; cin >> n >> k; for (int i = 1; i <= n; i++) { // cin >> tmp; scanf("%d", &tmp); origin[i] = tmp; lastPos[tmp] = i; } // stack int stackIter = 1; for (int i = 1; i <= n; i++) { if (stackIter == 1) { // insert anyway seq[stackIter] = origin[i]; marked[origin[i]] = true; stackIter += 1; } else { if (seq[stackIter - 1] == origin[i] || marked[origin[i]]) { continue; } while (true) { if (stackIter != 1 && seq[stackIter - 1] >= origin[i] && i < lastPos[seq[stackIter - 1]]) { // pop marked[seq[stackIter - 1]] = false; stackIter -= 1; } else { // insert seq[stackIter] = origin[i]; marked[origin[i]] = true; stackIter += 1; break; } } } } if (stackIter <= k) { cout << "Kanade"; return0; } for (int i = 1; i < stackIter; i++) { //cout << seq[i] << " "; printf("%d ", seq[i]); } return0; }
测试例生成(Python3)
1 2 3 4 5 6
import random defk(n,k): a = [str(random.randint(1, k)) for i inrange(n)] f = open('in', 'w') f.write("{} {}\r\n{}\r\n".format(n, k, " ".join(a))) f.close()
彩蛋
吐个槽,我在本机上测试1e6的数据量,默认编译器是clang++ 11.0.3 with LLVM,跑了两秒多,换成g++9瞬间提升到0.08秒,绝了。