51nod 1276 岛屿的数量

来源:互联网 发布:sql的count 1 编辑:程序博客网 时间:2024/05/16 11:30

参考:http://blog.csdn.net/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;}
原创粉丝点击