参考:http://blog.youkuaiyun.com/qingshui23/article/details/51867942
我先用rmq+dfs做的,超时。。。然后看了看讨论,没看懂讨论的啥,看了题解后,才明白。原来这题是用的离线做法,先把所有查询都读取进来后再进行处理,这样时间复杂度就很低了。第一次遇到这样做的题目,涨知识。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e4+10;
struct node
{
int pos,val;
bool operator<(const node& b)const{return val < b.val;}
};
node a[MAXN],q[MAXN];
int res[MAXN];
bool vis[MAXN];
int main()
{
ios::sync_with_stdio(false);
int n,qq;
cin >> n >> qq;
for(int i = 0; i < n; ++i)
{
cin >> a[i].val;
a[i].pos = i;
}
for(int i = 0; i < qq; ++i)
{
cin >> q[i].val;
q[i].pos = i;
}
sort(a,a+n);
sort(q,q+qq);
int j = 0;
int sum = 1;
for(int i = 0; i < qq; ++i)
{
while(a[j].val <= q[i].val && j < n)
{
if(a[j].pos == 0)
{
if(vis[1])
sum--;
}
else if(a[j].pos == n-1)
{
if(vis[n-2])
sum--;
}
else
{
if(vis[a[j].pos-1] && vis[a[j].pos+1])
sum--;
else if(!vis[a[j].pos-1] && !vis[a[j].pos+1])
sum++;
}
vis[a[j].pos] = true;
++j;
}
res[q[i].pos] = sum;
}
for(int i = 0; i < qq; ++i)
cout << res[i] << endl;
return 0;
}