UVA501 Black Box 题解

Doveqise

2019-05-21 20:18:10

Solution

#### 前言:先一如既往的吐槽一下UVa评测姬 切入正题 这道题,刚入眼:啊,一道模拟 然后敲了以下垃圾模拟代码 ```c++ #include<bits/stdc++.h> using namespace std; int ADD[30005]; int Array[100005]; int I,cnt; void add(int i) { cnt++; Array[cnt]=ADD[i]; return; } void get() { I++; sort(Array+1,Array+1+cnt); printf("%d\n",Array[I]); return; } signed main() { int T;scanf("%d",&T); while(T--) { memset(ADD,0,sizeof(ADD)); memset(Array,0,sizeof(Array)); I=cnt=0; int m,n,now=0; scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) { scanf("%d",&ADD[i]); } for(int i=1;i<=n;i++) { int t; scanf("%d",&t); if(now==t) { get(); continue; } while(now<t) { now++; add(now); } get(); } puts(""); } return 0; } ``` 果断TLE emmm然后分析了一下复杂度 抽了自己俩耳光 这题**显然**不能次次查询都sort 然后想到了lower_bound()插入 分析了一下复杂度是O(能过) 然后把Array换了一个vector,代码如下 ```c++ #include<bits/stdc++.h> using namespace std; int ADD[30005]; vector<int>Array; vector<int>::iterator it; int cnt; void add() { it=lower_bound(Array.begin(),Array.end(),ADD[cnt]); if(it!=Array.end()) Array.insert(it,ADD[cnt++]); else Array.push_back(ADD[cnt++]); return; } void get(int i) { printf("%d\n",Array[i]); return; } signed main() { int T;scanf("%d",&T); while(T--) { memset(ADD,0,sizeof(ADD)); Array.clear(); cnt=0; int m,n; scanf("%d%d",&m,&n); for(int i=0;i<m;i++) { scanf("%d",&ADD[i]); } for(int i=0;i<n;i++) { int t; scanf("%d",&t); while(cnt<t) add(); get(i); } puts(""); } return 0; } ``` 然后赤裸裸的WA了emmm 挠了挠头 看了一下题面   #### 每组输出之间用一组空行隔开 想着"多一行空行应该没什么事吧"就在puts("");前面加了一个if(T) 然后就A了emmm UVa魔鬼吧QwQ