【POI每日题解 #7】TES-Intelligence Test

题目链接

这道题第一眼看去类比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\n");
16         else printf("NIE\n");
17     }
关键部分

 

posted @ 2018-06-27 07:14  hjmmm  阅读(142)  评论(0编辑  收藏  举报