这道题第一眼看去类比BANK-Cash Dispenser
不过1e6 * 1e6 = 1e12 分分钟MLE啊
想到优化 就yy到一种近似主席树的做法 来维护类似BANK的一堆序列
开心地打完 然鹅 MLE 陷入沉思
对一个值 有三种取得方式 一 存储 二 查找 三 推导
我们需要知道一个数后的另一个数在哪里
前者的最优方式已经凉了【或许有更优?请路过神犇指教
三看起来好像不大可行。。。
那就二吧
但线性查找肯定凉的 想到log级优化
Log + 查找 = 二分查找啊
但是原数列不具有单调性
然鹅竟然卡在这里了= =
题解:存储一个数所在的位置
每次求这目标数的位置中大于当前数的最小位置
然鹅 这样存数组还是1e12的
只好上vector了
附:vector讲解
1 while(n--){ 2 scanf("%d", &l); 3 for(int i = 1; i <= l; i++) scanf("%d", &a[i]); 4 //注意这里做离线!不然在后面退出的时候会导致残留 5 int j = 0; bool flag = 1; 6 vector<int> :: iterator it; 7 for(int i = 1; i <= l; i++){ 8 it = upper_bound(v[a[i]].begin(), v[a[i]].end(), j); 9 //STL就是6 10 if(it == v[a[i]].end()){ 11 flag = 0; break; 12 } 13 else j = *it; 14 } 15 if(flag) printf("TAK "); 16 else printf("NIE "); 17 }